原题地址
今天刚刚学会的一个算法,刚看到这题懵逼至极(数学贼差)
还是看别人分析才知道如何去动态规划
#include<stdio.h>
int max(int x,int y)
{
if(x>y)
return x;
else
return y;
}
int main()
{
int T,n,dp[120][120];
int max1[120][120];
scanf("%d",&T);
while(T--)
{
int i,j;
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
scanf("%d",&dp[i][j]);
for(i=1;i<=n;i++)
max1[n][i]=dp[n][i];//存贮最后一行
for(i=n-1;i>=1;i--)
for(j=1;j<=i;j++)
max1[i][j]=max(max1[i+1][j],max1[i+1][j+1])+dp[i][j];
printf("%d\n",max1[1][1]);
}
return 0;
}
代码很乱,将就着看,反正也是自己记录下,以便重温。
整体思路就是:
数塔要规划处最大路线,到第二层时,我们是不知道往左有
最大值还是往右有。所以我们要从最底层往上推。以上图为例,如何前三层已知最大路线,如果到达2,选19,18 选10 9选10 5选16
得到结果分别为21 28 19 21存储进一个max1数组。然后同样的方法向上推至第三层,10就选28,6选28,8选21,得到38 34 29 存入max1数组。第二层12选38,15选34,得到50,49存入数组。第一层选五十,得到59,则完成路线得到最大值。