题目大意:有一个塔,现在求从塔顶走到底层经过的数字节点之和最大值
思路:先计算第二层的每一个最大有多大,然后根据第二层的计算第三层的,循环直到求出最后一层(不过代码是从最后一层到第一层,都一样
z[i][j]=max(z[i][j]+z[i+1][j],z[i][j]+z[i+1][j+1])就可以了
#include<stdio.h>
#include<string.h>
int max(int a,int b){
if(a>b) return a;
return b;
}
int main(void)
{
int z[105][105];
int num;
scanf("%d",&num);
while(num--){
int n;
scanf("%d",&n);
int i,j;
memset(z,0,sizeof(z));
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(i>=j) scanf("%d",&z[i][j]);
}
}
for(i=n-2;i>=0;i--){
for(j=0;j<n;j++){
z[i][j]=max(z[i][j]+z[i+1][j],z[i][j]+z[i+1][j+1]);//变换
}
}
printf("%d\n",z[0][0]);
}
return 0;
}
本文介绍了一个使用动态规划解决从塔顶到底层路径上数字节点之和最大的问题。通过从底层到顶层逐层更新节点值的方式,最终求得从塔顶到底层的最大路径和。
HDU - 2084&spm=1001.2101.3001.5002&articleId=71305501&d=1&t=3&u=8dab2f3638b74c5eb780f6d8bb64c659)
372

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



