题目分析:
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#include 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]<
总结:1.从集合的角度看DP。



