题目链接:摘花生
题目分析:
0.该题是一道线性DP(数字三角形模型)。
1.状态表示
集合:定义f[i][j]为从(1, 1)到达(i, j)的所有方案
属性:最大值
2.状态转移
(i, j)从(i-1, j)即上方过来
(i, j)从(i, j-1)即左方过来
3.空间压缩
f[i][j]只需要用到这一层和上一层的f元素,所以可以压缩成滚动数组。在此之上,还可以直接压缩成一维数组。
code:
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 110;
int w[N][N];
int f[N][N];
int n,m;
int main()
{
int k;
cin >> k;
while(k--)
{
cin >> n >> m;
for(int i = 1; i <= n; i ++ )
for(int j = 1; j <= m; j ++ )
cin >> w[i][j];
for(int i = 1; i <= n; i ++ )
for(int j = 1; j <= m; j ++ )
{
f[i][j] = max(f[i - 1][j],f[i][j - 1]) + w[i][j];
}
cout << f[n][m]<<endl;
}
return 0;
}
总结:
1.从集合的角度看DP。