【題解】ZeroJudge e878: Q2 得分高手

【題目敘述】https://zerojudge.tw/ShowProblem?problemid=e878
【解題想法】bottom-up DP

#include <iostream>
#include <algorithm>
using namespace std;
int m, n;
int dp[3005][3005];

void printDP(){
    cout << "**********\n";
    for (int i=0; i<m; i++){
        for (int j=0; j<n; j++){
            cout << dp[i][j] << " ";
        }
        cout << "\n";
    }
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cin >> m >> n;
    for (int i=0; i<m; i++){
        for (int j=0; j<n; j++){
            cin >> dp[i][j];
        }
    }
    //printDP();
    int mx = dp[0][0];
    for (int i=1; i<m; i++){
        dp[i][0] = max(dp[i][0], dp[i-1][0] + dp[i][0]);
        mx = max(mx, dp[i][0]);
    }
    for (int j=1; j<n; j++){
        dp[0][j] = max(dp[0][j], dp[0][j-1] + dp[0][j]);
        mx = max(mx, dp[0][j]);
    }
    
    for (int i=1; i<m; i++){
        for (int j=1; j<n; j++){
            dp[i][j] = max({dp[i][j], dp[i-1][j] + dp[i][j], dp[i][j-1] + dp[i][j]});
            mx = max(mx, dp[i][j]);
        }
    }
    //printDP();
    cout << mx << "\n";
    return 0;
}
分享本文 Share with friends