hdu2084数塔

经典问题了,题意我就不叙述了(题目是中文的~)

分析:dp[i][j]表示在第i行第j个位置上能取得的最大和,那么要从最后一行开始算起,到塔顶结束:dp[i][j] = a[i][j]+max(dp[i+1][j], dp[i+1][j+1]), 边界条件是dp[n][j] = a[n][j];

代码:

View Code
 1 #include <stdio.h>
 2 #include <iostream>
 3 using namespace std;
 4 #define DEBUG
 5 const int MAXN = 100 + 5;
 6 int a[MAXN][MAXN], dp[MAXN][MAXN];
 7 int max(int a, int b){
 8     return a>b?a:b;
 9 }
10 int main(){
11 #ifndef DEBUG
12     freopen("in.txt", "r", stdin);
13 #endif
14     int cas;
15     scanf("%d", &cas);
16     while(cas--){
17         int n;
18         scanf("%d", &n);
19         int i, j;
20         for(i=1; i<=n; i++)
21             for(j=1; j<=i; j++)
22                 scanf("%d", &a[i][j]);
23         for(j=1; j<=n; j++) dp[n][j] = a[n][j];
24         for(i=n-1; i>=1; i--)
25             for(j=1; j<=n; j++)
26                 dp[i][j] = a[i][j] + max(dp[i+1][j], dp[i+1][j+1]);
27         printf("%d\n", dp[1][1]);
28     }
29     return 0;
30 }
Greatness is never a given, it must be earned.
原文地址:https://www.cnblogs.com/zjutzz/p/2910741.html