标签:
动态规划的要素是“最优子结构”和“重叠子问题”。
解决问题最重要的是确定“状态”的含义和“转移方程”,以及最终解的状态表示。
对于本题而言:
状态 —— V[i, j]这个状态表示从顶(第一层第一个元素)到第i层第j个元素能达到的最大值
转移方程 —— V[i, j] = max(V[i-1, j-1], V[i-1, j]) + x,x是第i层第j个元素的值
最终解的状态表示 —— max(V[n, k]) for all 1<=k<=n,其中 n 是最大层数
本题中,由于转移方程只用到了上层的两个状态,所以可以利用滚动数组把状态压缩成一维以减少内存开销。
#include <iostream>
#include <algorithm>
using namespace std;
int v[205];
int main() {
int n;
cin >> n;
for (int i = 1; i <= n; i++) {
int t = 0;
for (int j = 0; j < i; j++) {
int x;
cin >> x;
int val = max(t, v[j]) + x;
t = v[j];
v[j] = val;
}
}
int ans = 0;
for (int j = 0; j < n; j++) {
ans = max(ans, v[j]);
}
cout << ans << endl;
return 0;
}
当然,本题还可以定义别的状态和转移方程,比如用F[i,j]表示从第i层第j个元素出发到达最底层所能达到的最大值等等。
标签:
原文地址:http://www.cnblogs.com/xblade/p/4456743.html