以所经过的权值之和最大值为例进行说明。
行进的过程中,每次只有两种选择:向左或向右。一个有n层的数字三角形的完整路径有2n条,所以当n比较大的时候,搜索全部路径,从中找出最大值,效率较低。
采用动态规划方法实现。
用d(i,j)表示从位置(i,j)出发时得到的最大值(包括位置(i,j)本身),可以写出最大值的递归方程:
由于递归方程中包含了重复子问题,直接采用递归方程求解, 效率较低。采用动态规划的方法,用一张二维表记录中间过程的值,可以把时间效率提高到n2。
#include<stdio.h>
#define N 100
#include<string.h>
int MAXSUM(int a[][N],int n,int x[])
{
int i,j,t;
for(i=n-1;i>=1;i--){ //从最底层开始寻找
for(j=1;j<=i;j++){ //每行遍历
if(a[i+1][j]>a[i+1][j+1]){ //左边分支大
a[i][j]+=a[i+1][j];
t=a[i+1][j]; //用于记录路径
}
else{ //右边分支大
a[i][j]+=a[i+1][j+1];
t=a[i+1][j+1]; //用于记录路径
}
}
x[i]=t;
}
return a[1][1]; //一直累加到顶端
}
void main()
{
int i,j,n,first;
int a[N][N],x[N];
printf("需要输入多少层的三角形?\n");
scanf("%d",&n);
printf("开始输入数字三角形数据:\n");
for(i=1;i<=n;i++){
for(j=1;j<=i;j++){
scanf("%d",&a[i][j]);
}
}
first=a[1][1];
printf("第一层到最后一条路经过的权值最大值为: %d\n",MAXSUM(a,n,x));
printf("所经过的路径是:\n");
printf("%d->",first);
for(i=1;i<=n-2;i++){
printf("%d->",x[i]-x[i+1]);
}
printf("%d\n",x[n-1]);
getchar();
}
三角形矩阵最大路径 行走方式只有左右两种方式 如果把问题看出二叉树 那么问题就看得明白了
把我输入的值 做为例子所讲
不管几层原理都一样 选择了较大的 只能一路走下去