数字三角形,简单的动态规划
洛谷 P1216
详情看注释
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int a[1010][1010], d[1010][1010]; // a表示原数组,d表示动态规划数组
int r; // 行数
int solve(int i, int j)
{
if (d[i][j] >= 0) return d[i][j];
else return d[i][j] = a[i][j] + (i == r ? 0 : max(solve(i+1,j), solve(i+1, j+1))); // 状态转移方程;
}
int main()
{
memset(d, -1, sizeof(d)); // memset只能批量初始化0和-1;其他不行
cin >> r;
for (int i = 0; i < r; i++) {
for (int j = 0; j <= i; j++) {
cin >> a[i][j];
}
}
int ans = 0;
// 递推方式
for (int k = 0; k < r; k++) d[r-1][k] = a[r-1][k]; // 把a的最后一行赋值给d的最后一行
for (int i = r - 2; i >= 0; i--) {
for (int j = 0; j <= i; j++) {
d[i][j] = a[i][j] + max(d[i+1][j], d[i+1][j+1]);
}
}
ans = d[0][0];
// 递归方式
// ans = solve(0, 0);
cout << ans;
return 0;
}