简单的动态规划
- 数塔问题:
- 9
- 12 15
- 10 6 8
- 2 18 9 5
- 19 7 10 4 16
-
有形如图所示的数塔,从顶部出发,在每一结点可以选择向左走或是向右走,一直走到底层,要求找出一条路径,使路径上的值最大。或者是从低往上走,使路径上的值最大。下面代码是从下往上走,要找到从下往上找,用数组一存就行。
#include <iostream> using namespace std; int f[1005][1005], s[1005][1005]; //f 记录初始数据, s: 记录每次的最值, int n; void tower(){ for(int i = 1; i <= n; ++i){ s[n][i] = f[n][i]; } for(int i = n - 1; i >= 1; i--){ for(int j = 1; j <= i; ++j){ s[i][j] = f[i][j] + max(s[i + 1][j], s[i + 1][j + 1]); } } } void get_route(int i, int j){ if(i == n){ cout << f[i][j] << endl; } else { if(s[i + 1][j] == s[i][j] - f[i][j]){ cout << f[i][j] << " -> "; get_route(i + 1, j); } else { cout << f[i][j] << " -> "; get_route(i + 1, j + 1); } } } int main(){ cin >> n; for(int i = 1; i <= n; ++i){ for(int j = 1; j <= i; ++j){ cin >> f[i][j]; } } tower(); cout << "最大值:" << endl; cout << s[1][1] << endl; cout << "路径" << endl; get_route(1, 1); return 0; } /* 5 9 12 15 10 6 8 2 18 9 5 19 7 10 4 16 */