Submission
Status:
[PPPP-SSSSSSSSSS]
Score: 0
User: Jibhong
Problemset: อัศวินขี่ม้าขาว
Language: cpp
Time: 0.005 second
Submitted On: 2025-03-31 09:48:46
#include <bits/stdc++.h>
using namespace std;
const int INF = 2e9;
using pii = pair<int, int>;
int mem[1005][1005];
vector<vector<int>> dp(1005, vector<int>(1005, -INF));
int n, m;
bool is_valid(int mid) {
vector<vector<int>> dp(n + 1, vector<int>(m + 1, -INF));
dp[1][1] = mid + mem[1][1]; // Start with initial health
if (dp[1][1] <= 0) return false; // If we start with negative or zero, it's invalid
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
if (i == 1 && j == 1) continue;
if (i > 1 && dp[i - 1][j] > 0) {
dp[i][j] = max(dp[i][j], dp[i - 1][j] + mem[i][j]);
}
if (j > 1 && dp[i][j - 1] > 0) {
dp[i][j] = max(dp[i][j], dp[i][j - 1] + mem[i][j]);
}
}
}
return dp[n][m] > 0;
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
cin >> mem[i][j];
}
}
int l = 0, r = INF;
while (l < r) {
int mid = (l + r) / 2;
if (is_valid(mid)) r = mid;
else l = mid + 1;
}
cout << l << '\n';
return 0;
}