如图所示为一个数塔,从顶部出发在每一个节点可以选择向左走或向右走,一直走到最底层,要求找出一条路径,使路径上的数值和最大。
#include <stdio.h>
#define N 50
int data[N][N],d[N][N];//定义数组data[],d[]
int n;
void operate()
{
int i,j;
for (j=1;j<=n;j++)
{
d[n][j]=data[n][j];
}
for (i=n-1;i>=1;i--)
{
for (j=1;j<=i;j++)
{
if (d[i+1][j]>d[i+1][j+1])
{
d[i][j]=data[i][j]+d[i+1][j];
}
else
{
d[i][j]=data[i][j]+d[i+1][j+1];
}
}
}
}//这个实际上是把基础数组data[]转化为操作数组d[],最后一行一样,从倒数第二行到第一行,d[]数组是data[]数组的最优数组!
void path()
{
int i,k,y;
printf("%d",data[1][1]);
k=1;
for (i=2;i<=n;i++)
{
if (y==d[i][k+1])//重点分析在这里!我们知道数据只有左右,此行代码是先判断是否是d[i][2],
//如果不是就是d[i][1],程序只会朝右走而不会回去,所以k要么不加要么就加一
{
k++;
}
printf("-->%d",data[i][k]);
}
}//这个是显示数据实际走的方向以及数据!通过d[i][j]-data[i][j]找到下面实际的数据
void main()
{
int i,j;
printf("请输入数塔层数:");
scanf("%d",&n);
printf("数据为:\n");
for (i=1;i<=n;i++)
{
for(j=1;j<=i;j++)
{
scanf("%d",&data[i][j]);
}
}//输入基础数组data[]
operate();
printf("路径最大和为=%d\n",d[1][1]);
path();
}
动态规划-数塔
最新推荐文章于 2022-04-03 09:14:04 发布