dp46上 HDU2084
发布日期:2021-06-29 21:39:36 浏览次数:2 分类:技术文章

本文共 904 字,大约阅读时间需要 3 分钟。

在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 
有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少? 
 
已经告诉你了,这是个DP的题目,你能AC吗?
Input
输入数据首先包括一个整数C,表示测试实例的个数,每个测试实例的第一行是一个整数N(1 <= N <= 100),表示数塔的高度,接下来用N行数字表示数塔,其中第i行有个i个整数,且所有的整数均在区间
0,99 0,99内。 
Output
对于每个测试实例,输出可能得到的最大和,每个实例的输出占一行。 
Sample Input
1573 88 1 0 2 7 4 44 5 2 6 5
Sample Output

30

代码:

#include<cstdio>

#include<algorithm>
#include<cstring>
#include<queue>
#include<map>
#include<set>
typedef long long LL;
const int maxn=105;
using namespace std;
int main()
{
    int i,j,n,t;
    int dp[maxn][maxn],a[maxn][maxn];
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d",&n);
        for(i=1;i<=n;i++)
        {
            for(j=1;j<=i;j++)
            {
                scanf("%d",&a[i][j]);
            }
        }
        memset(dp,0,sizeof(dp));
        for(j=1;j<=n;j++) dp[n][j]=a[n][j];//边界问题,将行赋值给dp数组
        for(i=n-1;i>=1;i--)//一定是逆序枚举的
            for(j=1;j<=i;j++)
            dp[i][j]=a[i][j]+max(dp[i+1][j],dp[i+1][j+1]);//取左下右下较大着
        printf("%d\n",dp[1][1]);//由于逆序枚举,所以答案是dp[1][1];
    }
    return 0;
}

转载地址:https://dh-butterfly.blog.csdn.net/article/details/70159994 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:dp46上 HDU1421
下一篇:Codeforces 796A

发表评论

最新留言

不错!
[***.144.177.141]2024年04月18日 21时57分22秒