您的位置:首页 > 编程语言 > C语言/C++

算法 数字三角形问题

2016-12-25 17:00 288 查看

题目

给定一个由n行数字组成的数字三角形,设计算法,计算出从三角形的顶至底的一条路径,使该路径经过的数字总和最大

测试用例:

5(行数)

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

输出:30

分析

用二维数组f[i][j]表示第i行的第j个数能得到的最大值:
f[i][j]=max{f[i-1][j-1],f[i-1][j]}+map[i][j] 其中map是给定值的数组
每行第一个只能选择上一行的第一个 f[i][1]=f[i-1][1]+map[i][1];
每行最后一个只能选择上一行的最后一个 f[i][i]=f[i-1][i-1]+map[i][i];


#include <iostream>
#define n 5
int f[10][10];

int getmax(int a, int b){
return a>b?a:b;
}
int main(){
int i,j,maxValue=0;
int map[n+1][n+1];
for(i=1;i<=n;i++){
for(j=1;j<=i;j++){
printf("请输入第%d行,第%d个数:",i,j);
scanf("%d",&map[i][j]);
}
}
f[1][1]=map[1][1];
for(i=2;i<=n;i++){
for(j=1;j<=i;j++){
if(j==1)
f[i][j]=f[i-1][j]+map[i][j];//每行的第一个
else if(j==i)
f[i][j]=f[i-1][j-1]+map[i][j];//每行的最后一个
else
f[i][j]=getmax(f[i-1][j-1],f[i-1][j])+map[i][j];//可以有两种选择的
}
}
for(j=1;j<=n;j++){
if(f
[j]>maxValue)
maxValue=f
[j];
}
printf("%d\n",maxValue);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息