hdu-2084 数塔(动态规划)

Time limit1000 ms

Memory limit32768 kB

在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 

有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 
 
已经告诉你了,这是个DP的题目,你能AC吗? 

Input输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间[0,99]内。 
Output对于每个测试实例,输出可能得到的最大和,每个实例的输出占一行。 
Sample Input

1
5
7
3 8
8 1 0 
2 7 4 4
4 5 2 6 5

Sample Output

30

题解:从上往下走比较困难,从下往上走还是比较简单的。倒数第二层的更新为自己的数字加上下面的两个分支的大的那个,倒数第二层遍历完之后最后一层就没用了,然后遍历倒数第三层,也是自己的数字加上下面的两个分支的大的那个,以此类推就可以了。
#include<iostream>
#include<algorithm>
#include<cstring>
#include<sstream>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<stack>
using namespace std;
#define PI 3.14159265358979323846264338327950


int dp[102][102],a[102][102];
int main()
{
   int t;
   cin>>t;
   while(t--)
   {
       int n;
       cin>>n;
       memset(dp,0,sizeof(dp));
       for(int i=1;i<=n;i++)
           for(int j=1;j<=i;j++)
               cin>>a[i][j];
       
           for(int j=1;j<=n;j++)
               dp[n][j]=a[n][j];
       for(int i=n;i>=1;i--)
           for(int j=1;j<=n;j++)
               dp[i][j]=max(dp[i+1][j],dp[i+1][j+1])+a[i][j];
       cout<<dp[1][1]<<endl;
   }
}

猜你喜欢

转载自www.cnblogs.com/smallhester/p/9499167.html
今日推荐