数塔问题
#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; }