问题描述:
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
这是一个数字三角阵的例子。你将从顶部(7)开始,每次选择向左下或右下走一格直到阵底。请写一个程序,计算从阵顶到阵底的一条路中,经过的数字(包括头尾)总和的最大值。
输入:
第一行为1<n<101,表示三角阵的行数
从下一行起输入三角阵,每个节点的值都是0~99的整数。
输出
一个整数,表示和的最大值。
样例输入:
5
7
3 8
8 1 0
2 7 4 4
4 5 2 6 5
样例输出:
30
分析:
方法一:
顺序分析,f[i][j]可以选择两种状态相加-->f[i+1][j]或者f[i+1][j+1]
f[i][j]表示:到达这个位置之后的数,加上f[i][j]这个位置的数,加在一起最大和。
#include<stdio.h>
int max(int x,int y){
if(x>y)
return x;
else
return y;
}
int main()
{
int i,j;
int n;
int f[110][110];
scanf("%d",&n);
for(i=1;i<=n;i++){
for(j=1;j<=i;j++)
scanf("%d",&f[i][j]);
}
for(i=n-1;i>=1;i--){
for(j=1;j<=i;j++){
f[i][j]+=max(f[i+1][j],f[i+1][j+1]);
}
}
printf("%d",f[1][1]);
return 0;
}
方法二:
倒推,由此可知,f[i][i]可由f[i-1][j]或者f[i-1][j-1]这两条路径中的某一条(数值最大的那条)得到。
f[i][j]表示:到达这个位置之前的数,加上f[i][j]这个位置的数,加在一起最大和。
#include<stdio.h>
int max(int x,int y){
if(x>y)
return x;
else
return y;
}
int main()
{
int i,j;
int n,maxs;
int arr[110][110];
int f[110][110]={0};
scanf("%d",&n);
for(i=1;i<=n;i++){
for(j=1;j<=i;j++)
scanf("%d",&arr[i][j]);
}
f[1][1]=arr[1][1];
for(i=2;i<=n;i++)
for(j=1;j<=i;j++)
f[i][j]=arr[i][j]+max(f[i-1][j-1],f[i-1][j]);
maxs=0;
for(i=1;i<=n;i++){
maxs=max(f[n][i],maxs);
}
printf("%d",maxs);
return 0;
}