数塔 (dp)HDU - 2084
2017-05-06 22:47
447 查看
题目大意:有一个塔,现在求从塔顶走到底层经过的数字节点之和最大值
思路:先计算第二层的每一个最大有多大,然后根据第二层的计算第三层的,循环直到求出最后一层(不过代码是从最后一层到第一层,都一样
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;
}
思路:先计算第二层的每一个最大有多大,然后根据第二层的计算第三层的,循环直到求出最后一层(不过代码是从最后一层到第一层,都一样
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 数塔(水) 经典简单DP
- hdu 2084 数塔(dp ,水)
- HDU 2084 数塔 DP
- hdu 2084 数塔(水题,dp)
- [ACM] hdu 2084 数塔 (简单DP)
- HDU 2084 数塔 简单DP
- hdu2084 - 数塔 (经典dp)
- HDU 2084 数塔(DP)
- hdu 2084 数塔 dp
- hdu 2084(dp)
- hdu 2084 dp
- hdu 2084 数塔 (DP初步)
- hdu 2084 DP
- HDU 2084 数塔 DP
- (step3.2.3)hdu 2084(DP--数塔)
- DP入门,HDU 2084 数塔 参考代码
- hdu 2084(数塔-经典dp)
- [HDU] 2084 数塔 - 入门dp
- [ACM] hdu 2084 数塔 (简单DP)
- hdu 2084(数塔-经典dp)