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;
}