动态规划的要素是“最优子结构”和“重叠子问题”。
解决问题最重要的是确定“状态”的含义和“转移方程”,以及最终解的状态表示。
对于本题而言:
状态 —— 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