#include<iostream>
#include<stdlib.h>
using namespace std;
int m;
int max(int,int);
void dqta(int **data,int **d);//寻找最优值
void fpath(int **data,int **d,int *path);//寻找最优路径
int max(int x,int y){
if(x>y)return x;
else return y;
}
void dqta(int **data,int **d){
int i,j;
for(j=0;j<m;j++)
d[m-1][j]=data[m-1][j];
for(i=m-2;i>=0;i--)
for(j=0;j<=i;j++)
d[i][j]=max(d[i+1][j],d[i+1][j+1])+data[i][j];
}
void fpath(int **data,int **d,int *path)
{
int i,j,b;
path[0]=data[0][0];
j=0;
for(i=1;i<m;i++)
{
b=d[i-1][j]-data[i-1][j];
if(b==d[i][j])
{
path[i]=data[i][j];
}
else
{
path[i]=data[i][j+1];
j++;
}
}
}
int main(){
int i,j;
cin>>m;
//创建动态数组;
int **data=(int **)malloc(sizeof(int *)*m);
for(i=0;i<m;i++)
data[i]=(int *)malloc(sizeof(int)*m);
int **d=(int **)malloc(sizeof(int *)*m);
for(i=0;i<m;i++)
d[i]=(int *)malloc(sizeof(int)*m);
int *path=(int *)malloc(sizeof(int)*m);
//读取文件中的数据;
for(i=0;i<m;i++)
for(j=0;j<=i;j++)
cin>>data[i][j];
dqta(data,d);
printf("最大值为:%d\n",d[0][0]);
fpath(data,d,path);
printf("最终路径为:\n");
for(i=0;i<m;i++)
printf("%d\n",path[i]);
return 0;
}
/*
5
13 11 8 40 7 26 6 14 15 8 12 7 13 24 11
*/
给个代码简练点的
#include<stdio.h>
#include<stdlib.h>
#define N 5
main(){
int i,j;
int data[N][N] = {
{9,0,0,0,0},
{12,15,0,0,0},
{10,6,8,0,0},
{2,18,9,5,0},
{19,7,10,4,16}
};
for(i = N-1; i > 0; i--)
for(j = 0; j < i; j++)
data[i-1][j] += data[i][j] > data[i][j+1] ? data[i][j] : data[i][j+1];
printf("%d",data[0][0]);
return EXIT_SUCCESS;
}