数塔
题目链接 : http://acm.hdu.edu.cn/showproblem.php?pid=2084
前不久,遇到一个DP题,当时没想到是数塔,没思路之下便搜了一部分代码,看到有个和数塔类似的做法,便学了那个自上往下处理的方法;
巧的是在一次竞赛中出现了那题,结果过不去,我自己出的数据也过不去,本以为我自己写错了程序,没想到竞赛结束后用那个代码运行我的那个数据竟然是错的答案;
后来问了别人,别人说那个算法是错的,之所以之前对,那是测试实例太弱;所以有很加学习了数塔,希望这次是学有所得,受打击了错不起了,不想错了:
这个DP应该也可以,只是为了感受或者说用下数塔,代码如下:
View Code
# include<stdio.h>
# include<string.h>
int dp[120][120];
int max(int a,int b)
{
if(a>b)
return a;
return b;
}
int main()
{
int i,j,n,t;
scanf("%d",&t);
while(t--)
{
memset(dp,0,sizeof(dp));
scanf("%d",&n);
for(i=0;i<n;i++)
{
for(j=0;j<=i;j++)
scanf("%d",&dp[i][j]);
}
for(i=n-2;i>=0;i--)
{
for(j=0;j<=i;j++)
dp[i][j]=dp[i][j]+max(dp[i+1][j],dp[i+1][j+1]);
}
printf("%d\n",dp[0][0]);
}
return 0;
}
本文深入探讨了数塔问题的动态规划解决方案,通过自上而下的处理方式,详细讲解了如何在给定的数塔中找到从顶部到底部的最大路径和。文章包括完整的代码示例,并对比了错误算法与正确算法的区别,强调了测试实例强度的重要性。
4万+

被折叠的 条评论
为什么被折叠?



