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