动态规划-数塔

如图所示为一个数塔,从顶部出发在每一个节点可以选择向左走或向右走,一直走到最底层,要求找出一条路径,使路径上的数值和最大。
#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();
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值