动态规划
1、从上往下:
状态转移方程:dp[i][j] = max(dp[i - 1][j - 1], dp[i - 1][j]) + f[i][j];
#include<iostream>
#include<algorithm>
using namespace std;
int r, f[1005][1005], dp[1005][1005], ans;
int main()
{
cin >> r;
for (int i = 1; i <= r; i++) {
for (int j = 1; j <= i; j++) {
cin >> f[i][j];
}
}
dp[1][1] = f[1][1];
for (int i = 2; i <= r; i++) {
for (int j = 1; j <= i; j++) {
dp[i][j] = max(dp[i - 1][j - 1], dp[i - 1][j]) + f[i][j];
ans = max(ans, dp[i][j]);
}
}
cout << ans << endl;
return 0;
}
2、从下往上
状态转移方程: dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + f[i][j];
#include<iostream>
#include<algorithm>
using namespace std;
int r, f[1005][1005], dp[1005][1005], ans;
int main()
{
cin >> r;
for (int i = 1; i <= r; i++) {
for (int j = 1; j <= i; j++) {
cin >> f[i][j];
}
}
for (int i = r; i >= 1; i--) {
for (int j = 1; j <= i; j++) {
dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + f[i][j];
}
}
cout << dp[1][1] << endl;
return 0;
}