Program3_F
来源:互联网 发布:路由器mac地址查询 编辑:程序博客网 时间:2024/06/18 08:14
我现在做的是第三专题编号哦为1006的试题,具体内容如下所示:
Problem F
Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other)
Total Submission(s) : 37 Accepted Submission(s) : 29
1573 88 1 0 2 7 4 44 5 2 6 5
30
解题思路:每个父节点会对应两个子节点,自底向上,父节点的值加上两个子节点中较大的一个的值,那么此时这最后一行的父节点又会是上一行的子节点,上一行的父节点再选这一行的子节点中较大的相加(也是最后一行的父节点)。因为每次都是选取的最大的子节点的值相加,那么当到达数塔塔尖的父节点时,它的值必定是最大。
编写代码:
#include <stdio.h>
#include <string.h>
int a[105][105];
int d[105][105];
int max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int T,n;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
scanf("%d",&a[i][j]);
}
}
int i,j;
for(i=1;i<=n;i++)
{
d[n][i]=a[n][i];
}
for(i=n-1;i>=1;i--)
{
for(j=1;j<=i;j++)
{
d[i][j]=a[i][j]+max(d[i+1][j],d[i+1][j+1]);
}
}
printf("%d\n",d[1][1]);
}
return 0;
}