Submission

Status:

[PPPPPPPPPPPPPPP]

Subtask/Task Score:

{100/100}

Score: 100

User: Phat12

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

Language: cpp

Time: 0.176 second

Submitted On: 2025-11-03 07:48:59

/*
TASK: c2_st65_knight.cpp
LANG: C++
AUTHOR: Phat
*/
#include <bits/stdc++.h>
#define FO(i,L,R) for (int i = L; i < R; i++)
using namespace std;
int arr[1001][1001];
int dp[1001][1001];
const int INF = 0x9f9f9f9f;
int32_t main(){
    cin.tie(nullptr)->sync_with_stdio(false);
    int n,m;
    cin >> n >> m;
    for (int i=1;i<=n;i++){
        for (int j=1;j<=m;j++){
            cin >> arr[i][j];
        }
    }
    memset(dp,0x9f,sizeof dp);
    int l=1,r=1e9;
    while (l<r){
        int mid = (l+r)/2;
        dp[n][m]=0;
        dp[1][1]=mid+arr[1][1];
        if (dp[1][1] <= 0) l=mid+1;
        for (int i=1;i<=n;i++){
            for (int j=1;j<=m;j++){
                if (i==1 && j==1) continue;
                int mx= max(dp[i-1][j],dp[i][j-1]);
                if (mx+arr[i][j] <= 0) {
                    dp[i][j] = INF;
                    continue;
                }
                dp[i][j]= mx+arr[i][j];
            }
        }
        // cerr << l << ' ' << mid << ' ' << r << '\n';
        // for (int i=1;i<=n;i++){
        //     for (int j=1;j<=m;j++){
        //         cerr << dp[i][j] << ' ';
        //     }
        //     cerr << '\n';
        // }
        // cerr << '\n';
        if (dp[n][m] > 0) r=mid;
        else l=mid+1;
    }
    cout << l;
    return 0;
}