[AcWing] 898. 数字三角形(C++实现)线性dp例题
1. 题目
2. 读题(需要重点注意的东西)
思路:
闫式dp分析法
用闫式dp分析法分析数字三角形问题
3. 解法
---------------------------------------------------解法---------------------------------------------------
#include<iostream>
using namespace std;
const int N = 510,INF = 1e9;
int n;
int a[N][N];
int f[N][N];
int main(){
cin >> n;
for(int i = 1;i <= n;i++)
for(int j = 1;j <= i;j++)
cin >> a[i][j];
// 为什么从0开始?因为最左端会获得来着0的不存在的节点
for(int i = 0;i <= n;i++)
// 为什么从i+1结束? 因为最右端会获得来着i+1的不存在的节点
for(int j = 0;j <= i+1;j++)
f[i][j] = -INF;
f[1][1] = a[1][1];
// 为什么i从2开始,j从1开始?
// f[1][1]附初值,需要从第二行开始计算
for(int i = 2;i <= n;i++)
for(int j = 1;j <=i;j++)
f[i][j] = max(f[i-1][j-1]+a[i][j],f[i-1][j]+a[i][j]);
int res = -INF;
for(int i = 1;i<= n;i++)
res = max(res,f[n][i]);
cout << res << endl;
return 0;
}
可能存在的问题
① 初始化时,为什么 i的范围是[ 0 , n ],j的范围是[ 0 , i + 1]?
因为最左端的值会获得来着0的不存在的节点;
因为最右端会获得来着i+1的不存在的节点。
② 求最大值的时候为什么 i 从2开始,j 从1开始?
f[1][1]直接附初值,需要从第二行第一列的数[2,1]开始计算。
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
- 动态规划
- 线性dp
6. 总结
线性dp的例题,理解思想并熟记代码。