动态规划法(数塔问题)

文章展示了一段C++代码,用于解决数塔问题,通过动态规划计算出从塔顶到底层的最大数字和,并输出最优路径。程序初始化数组,逐层进行决策,找到每个节点的最大加和值及其路径。
摘要由CSDN通过智能技术生成

1.代码

#include<iostream>
#include<stdio.h>
#include<windows.h>
using namespace std;

#define n 5
int DataTorwer(int d[n][n]);

int main()
{
	int d[n][n]={{8},{12,15},{3,9,6},{8,10,5,12},{16,4,18,10,9}};
	int max=DataTorwer(d);
	cout<<max<<endl;
	Sleep(80000);
	return 0;
}

int DataTorwer(int d[n][n])         //求解数塔问题,数塔存储在数组d[n][n]中
{
	int maxAdd[n][n] = {0}, path[n][n] = {0};       //初始化
	int i, j;
	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", d[0][0]);         //输出最顶层数字
			j = path[0][0];        //顶层决策是选择下一层列下标为path[0][0]的元素
			for (i = 1; i < n; i++)
			{
				printf("-->%d", d[i][j]);    
				j = path[i][j];        //本层决策是选择下一层列下标为path[i][j]的元素
			}
			printf("\n最大数值和为:");
			return maxAdd[0][0];               //返回最大数值和,即最终的决策结果
}

2.结果示例
在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值