HDU2084 数塔 DP

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

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

有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?

已经告诉你了,这是个DP的题目,你能AC吗?
 

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

Output
对于每个测试实例,输出可能得到的最大和,每个实例的输出占一行。
 

Sample Input
 
  
1573 88 1 0 2 7 4 44 5 2 6 5
 

Sample Output
 
  
30
 


 

惊奇的发现我这道题居然还没做,果断水过

由上往下推,由于结果状态多,不好处理

由底往上推,都归于一个起点,只需要算出由底往上得到的最大价值即可

方程:dp[i][j] = max(dp[i+1][j],dp[i+1][j+1])+a[i][j];

 

#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;int a[105][105],dp[105][105];int main(){    int t,n,i,j;    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        memset(dp,0,sizeof(dp));        for(i = 1;i<=n;i++)        {            for(j = 1;j<=i;j++)            scanf("%d",&a[i][j]);        }        for(i = n;i>=1;i--)        {            for(j = 1;j<=i;j++)            {                dp[i][j] = max(dp[i+1][j],dp[i+1][j+1])+a[i][j];            }        }        printf("%d\n",dp[1][1]);    }    return 0;}


 

           

给我老师的人工智能教程打call!http://blog.csdn.net/jiangjunshow
这里写图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值