线性Dp之数字三角形
动态规划最基础题型
状态表示
f [i] [j] : 从底向上走到(i,j)的路径距离
i:行
j:列(不过是斜着的列)
注意
从上到下:
划分原则是 根据 来自左上 or 来自右上 这样如果没有这个数,需要特判很麻烦
从下到上
划分原则是 根据 从左下到i,j or 从右下到 i,j,而左下或者右下除最后一行外一定会有,故只需要从倒数第二行开始循环即可
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 510;
int f[N][N];
int w[N][N];
int n;
int main()
{
cin >> n;
//输入数据
for(int i = 1; i <= n; i ++ )
for(int j = 1; j <= i; j ++)
cin >> w[i][j];
//底层数据,走到底层的距离就是他自己
for(int j = 1; j <= n; j ++ )
f[n][j] = w[n][j];
//从倒数第二行向上走
for(int i = n-1; i > 0; i --)
for(int j = 1; j <= i; j++)
f[i][j] = max(f[i + 1][j] + w[i][j],f[i + 1][j + 1] + w[i][j]);
cout << f[1][1] << endl;
return 0;
}