动态规划的要素是“最优子结构”和“重叠子问题”。
解决问题最重要的是确定“状态”的含义和“转移方程”,以及最终解的状态表示。
对于本题而言:
状态 —— 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个元素出发到达最底层所能达到的最大值等等。
 
                    
                     
                    
                 
                    
                 
 posted on
 posted on 
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号