Submission

Status:
[PPPPPPPPPPPPPPP]

Score: 100

User: njoop

Problemset: อัศวินขี่ม้าขาว

Language: cpp

Time: 0.356 second

Submitted On: 2025-03-13 14:26:30

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