yokobuttonの不定期で競技プログラミングをするブログ

不定期で解けた競技プログラミングコンテストの問題を載せています。

AtCoder Beginner Contest 224 B - Mongeness

問題の要約
 縦H行,横W列のマス目があり,各マスには1つの整数が書かれている。
 上からi行目,左からj列目のマスに書かれている整数はAi,j。
 マス目が下記の条件を満たすか判定しろ。
  1<=i1<i2<=Hおよび1<=j1<j2<=Wを満たすすべての整数の組(i1,i2,j1,j2)について,Ai1,j1+Ai2,j2 <= Ai2,j1+Ai1,j2が成り立つ。
制約
 2<=H,W<=50
 1<=Ai,j<=10^9
考え方
 1,i1,i2,j1,j2を1ずらす。
  1<=i1<i2<=H,1<=j1<j2<=W => 0<=i1<i2<=H-1,0<=j1<j2<=W-1
 2,4重のfor文を考える。
  ざっくり計算して50^4=6250000なので間に合う。
実際のプログラム
#include<iostream>
#include<vector>

using namespace std;


int main(){
  long long H,W;
  cin >> H >> W;
  vector<vector<long long>> A(H, vector<long long>(W));
  for(long long i = 0; i < H; i++){
    for(long long j = 0; j < W; j++){
      cin >> A[i][j];
    }
  }
  
  bool check = true;
  for(long long i1 = 0; i1 < H; i1++){
    for(long long i2 = i1+1; i2 < H; i2++){
      for(long long j1 = 0; j1 < W; j1++){
        for(long long j2 = j1+1; j2 < W; j2++){
          if(A[i1][j1]+A[i2][j2] > A[i2][j1]+A[i1][j2]){
            check = false;
          }
          if(!check){break;}
        }
        if(!check){break;}
      }
      if(!check){break;}
    }
    if(!check){break;}
  }
  if(check){
    cout << "Yes" << endl;
  }else{
    cout << "No" << endl;
  }
  
  return 0;
}