【題目敘述】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;
}