Submission
Status:
[PPPPPPPPPPPPPPP]
Score: 100
User: njoop
Problemset: อัศวินขี่ม้าขาว
Language: cpp
Time: 0.326 second
Submitted On: 2025-03-13 14:26:36
#include <bits/stdc++.h>
using namespace std;
int n, m, arr[1010][1010], dp[1010][1010];
bool solve(int hp) {
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
dp[i][j] = -1e9;
}
}
if(hp <= -arr[1][1]) return false;
dp[1][1] = hp+arr[1][1];
for(int i=2; i<=n; i++) {
if(dp[i-1][1] + arr[i][1] <= 0) break;
dp[i][1] = dp[i-1][1] + arr[i][1];
}
for(int i=2; i<=m; i++) {
if(dp[1][i-1] + arr[1][i] <= 0) break;
dp[1][i] = dp[1][i-1] + arr[1][i];
}
for(int i=2; i<=n; i++) {
for(int j=2; j<=m; j++) {
if(dp[i-1][j]+arr[i][j] <= 0 && dp[i][j-1]+arr[i][j] <= 0) continue;
dp[i][j] = max({dp[i][j], dp[i-1][j]+arr[i][j], dp[i][j-1]+arr[i][j]});
if(dp[i][j] == 0) dp[i][j] = -1e9;
}
}
if(dp[n][m] <= 0) return false;
return true;
}
int main() {
cin.tie(0)->sync_with_stdio(0);
cin >> n >> m;
for(int i=1; i<=n; i++) {
for(int j=1; j<=m; j++) {
cin >> arr[i][j];
}
}
int l=1, r=1e9;
while(l < r) {
int mid = (l+r)/2;
if(solve(mid)) {
r = mid;
} else {
l = mid+1;
}
}
cout << l;
}