动态规划入门一---------数字三角形

题源:poj1163:http://poj.org/problem?id=1163

题意:该题的意思是给一个三角形,找出从三角形最顶上走到最低边的一条加权最大的路之和(只能一直往下走)

我的方法是从自底向上找,用一个数组存三角形最后一行的数,再一行一行往上找,找到最大的和更新数组的值,最后数组的第一个数就是最终值。每个点只标记一次,一共n*(n-1)/2个点,

时间复杂度O(n*n(n-1)/2)

代码:

 1 /*
 2 5
 3 7
 4 3 8
 5 8 1 0
 6 2 7 4 4
 7 4 5 2 6 5
 8 */
 9 
10 #include <bits/stdc++.h>    
11 using namespace std;
12 const int maxn = 1010;
13 
14 int dp[maxn][maxn];
15 int *s; 
16 
17 int main()
18 {
19     int t;
20     int i,j;
21     cin >> t;
22     for(i = 0;i < t;++i){
23         for(j = 0;j < i+1;++j){
24             scanf("%d",&dp[i][j]);
25         }
26     }
27     s = dp[t-1];
28     for(i = t-2;i >= 0;--i){
29         for(j = 0;j < i+1;++j){
30             s[j] = max(dp[i][j]+s[j],s[j+1]+dp[i][j]);
31         }
32     }
33     cout << s[0] << endl;
34     return 0;
35 }

 

posted @ 2018-09-21 01:31  岁岁长安  阅读(139)  评论(0编辑  收藏  举报
//一下两个链接最好自己保存下来,再上传到自己的博客园的“文件”选项中