Submission

Status:

[PPxSSSSSSSSSSSS]

Subtask/Task Score:

{0/100}

Score: 0

User: Kx

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

Language: cpp

Time: 0.002 second

Submitted On: 2026-03-18 08:49:49

#include <bits/stdc++.h>
using namespace std;

const int mn = -(1e4 + 1);

int n, m;
vector<vector<int>> mp;
vector<vector<int>> mem;

int main() {
    cin >> n >> m;
    mp.assign(n, vector<int>(m)); for(int i = 0; i < n; ++i) {for(int j = 0; j < m; ++j) {cin >> mp[i][j];}}

    mem.assign(n, vector<int>(m, mn));
    mem = mp;

    for(int i = 0; i < n; ++i) {
        for(int j = 0; j < m; ++j) {
            if(i > 0 && j > 0) mem[i][j] = max(mem[i - 1][j], mem[i][j - 1]) + mp[i][j];
            if(i > 0 && j == 0) mem[i][j] += mem[i - 1][j];
            if(i == 0 && j > 0) mem[i][j] += mem[i][j - 1];
        }
    }

    vector<int> dist, min_v;
    int i = n - 1, j = m - 1;
    while(i > 0 || j > 0) {
        dist.push_back(mp[i][j]);
        int v = mem[i][j] - mp[i][j];
        if(mem[i - 1][j] == v) {
            i--;
        } else if(mem[i][j - 1] == v) {
            j--;
        }
    }
    dist.push_back(mp[i][j]);

    int res = 0;
    for(int i = 0; i < (int)dist.size(); ++i) {
        if(dist[i] < 0) {
            for(int j = i; j < (int)dist.size(); ++j) {
                res += dist[j];
            }
            break;
        }
    }

    res = abs(res) + 1;
    reverse(dist.begin(), dist.end());
    int test = res;
    for(int i = 0; i < (int)dist.size(); ++i) {
        test += dist[i];
        while(test <= 0) {
            res++, test++;
        }
    }

    cout << res;

    return 0;
}