码迷,mamicode.com
首页 > 其他好文 > 详细

hdu-2084 数塔(动态规划)

时间:2018-08-19 01:04:13      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:algo   memset   区间   自己的   efi   sample   idt   动态规划   tput   

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;
   }
}

 

 

hdu-2084 数塔(动态规划)

标签:algo   memset   区间   自己的   efi   sample   idt   动态规划   tput   

原文地址:https://www.cnblogs.com/smallhester/p/9499167.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!