#include<stdio.h>
#include<stdlib.h>
int DataTower(int d[][5],int n);
int main(void)
{
int s;
int n=5;
int a[5][5];
a[0][0]=8;
a[1][0]=12; a[1][1]=15;
a[2][0]=3; a[2][1]=9; a[2][2]=6;
a[3][0]=8; a[3][1]=10; a[3][2]=5; a[3][3]=12;
a[4][0]=16; a[4][1]=4; a[4][2]=18; a[4][3]=10; a[4][4]=9;
s=DataTower(a,5);
return 0;
}
int DataTower(int d[][5],int n) //求解树塔问题,数塔存储在数组d[n][n]中
{
int maxAdd[n][n];
int path[n][n];
int i,j;
for(int i=0; i<5; i++)
{
for(int j=0; j<=i; j++)
{
maxAdd[i][j]=0;;
path[i][i]=0;
}
}
for(j=0; j<n; j++) //初始化底层决策结果
maxAdd[n-1][j]=d[n-1][j];
for(i=n-2; i>=0; i--) //进行i层决策
{
for(j=0; j<=i; j++) //填写addMax[i][j],只填写下三角
{
if( maxAdd[i+1][j] > maxAdd[i+1][j+1] )
{
maxAdd[i][j]=d[i][j]+maxAdd[i+1][j];
path[i][j]=j; //本次抉择选取下标j的元素
}
else
{
maxAdd[i][j]=d[i][j]+maxAdd[i+1][j+1];
path[i][j]=j+1; //本次抉择选取下标j+1的元素
}
}
}
printf("路径最大和是:%d\n",maxAdd[0][0]);
printf("路径为:%d",d[0][0]); //输出顶层数字
j=path[0][0]; //顶层决策选择下标为path[0][0]的元素
for(i=1; i<5; i++)
{
printf("-->%d",d[i][j]);
j=path[i][j]; //本层决策是选择下一层下标为path[i][j]的元素
}
return maxAdd[0][0]; //返回最大数值和,即最终结果
}
动态规划法———数塔问题
最新推荐文章于 2023-05-24 10:11:07 发布