51nod1102(数塔)

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1002

 

题意:中文题诶~

 

思路:简单dp

从底层往上递推,每个节点的最大和为当前节点的值加上两个儿子中较大的值;

状态转移方程式为:dp[i][j]=max(dp[i+1][j], dp[i+1][j+1])+a[i][j];

 

代码:

 1 #include <bits/stdc++.h>
 2 #define MAXN 510
 3 using namespace std;
 4 
 5 int main(void){
 6     int n, a[MAXN][MAXN], dp[MAXN][MAXN];
 7     cin >> n;
 8     for(int i=0; i<n; i++){
 9         for(int j=0; j<=i; j++){
10             cin >> a[i][j];
11         }
12     }
13     memset(dp, 0, sizeof(dp));
14     for(int i=n-1; i>=0; i--){
15         for(int j=0; j<=i; j++){
16             dp[i][j]=max(dp[i+1][j], dp[i+1][j+1])+a[i][j];
17         }
18     }
19     cout << dp[0][0] << endl;
20     return 0;
21 }

 

posted @ 2017-01-03 16:44  geloutingyu  阅读(122)  评论(0编辑  收藏  举报