数塔问题

#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
",d[0][0]);

    fpath(data,d,path);

    printf("最终路径为:
");

    for(i=0;i<m;i++)
        printf("%d
",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;
}



原文地址:https://www.cnblogs.com/sjw1357/p/3863987.html