首页 > 代码库 > hdu2084动态规划入门题----数塔
hdu2084动态规划入门题----数塔
原题:数塔
这个是动态规划入门题,比较简单。
题意是:
一个数字组成的三角形,从上到下找一条路径,使这条路径上数字之和最大。
解题思路,就是要从下往上看。举个例子:
如果你从上到下走到了第4行第1个数,也就是2,那么接下来有两个数可以走19和7,而你必然会选择19。
所以就可以根据这个思路更新上面一行的数。把2更新成2+19=21。18更新成18+10=28,9更新成9+10=19,5更新成5+16=21
重复上面的思路最后第一行累加出来的就是最大值了。
思路很简单,最简单的实现就是你也开一个二维数组去存储动归过程的值。但是空间有优化的余地,就是不新开数组,使用原数组的最后一行来保存数据,因为我们每次只需要一行的数据,只要把累加的情况一直作用在最后一行上,就行了。那么最后一行的第一个数就是最大值。
#include <stdio.h> int main() { int c,n,num[100][100]; scanf("%d",&c); while(c--) { int i,j; scanf("%d",&n); for(i=0;i<n;i++) for(j=0;j<=i;j++) scanf("%d",&num[i][j]); for(i=n-2;i>=0;i--) for(j=0;j<=i;j++) { if(num[i][j]+num[n-1][j]>num[i][j]+num[n-1][j+1]) num[n-1][j]=num[i][j]+num[n-1][j]; else num[n-1][j]=num[i][j]+num[n-1][j+1]; } printf("%d\n",num[n-1][0]); } return 0; }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。