动态规划-C语言解决数塔问题

本文介绍了一种算法,通过动态规划解决数塔问题,从顶层开始向下计算每层的最大数值和,同时记录路径。输入二维数组,输出最大值及对应的路径数组。
摘要由CSDN通过智能技术生成

问题描述:从数塔的顶层出发,在每一个结点可以选择向左走或向右走,一直走到最底层,要求找出一条路径,使得路径上的数值和最大。

一个示例:

算法思想

输入:二维数组data[n][n]

data[5][5]
8
1215
396
810512
16418109

输出:数塔的最大数值和及其路径

1.for循环初始化数组addmax的最后一行为数塔底层 数据;

2.从n-1层开始直到第1层对下三角元素addmax进行求和,并用path[i][j]记录路径;

循环求最大和过程
第一层

8+max{49,52}

=60

第二层

12+max{31,37}

=49

15+max{37,29}

=52

第三层

3+max{24,28}

=31

9+max{28,23}

=37

6+max{23,22}

=29

第四层

8+max{16,14}

=24

10+max{4,18}

=28

5+max{18,10}

=23

12+max{10,9}

=22

初始化16418109

3.输出最大值和最佳路径。

注:path是一个二维数组,ij是下标,表示访问path数组中的某个元素。将j赋值给path[i][j],即将j存储到path数组的(i, j)位置。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<math.h>

int main() {
	int i, j;
	int n;
	printf("请输入数塔层数:");
	scanf("%d", &n);
	int data[10][10];
	int addmax[10][10];
	int path[10][10];
	printf("请输入数塔:\n");
	for (i = 0; i < n; i++) {
		for (j = 0; j <= i; j++) {
			scanf("%d", &data[i][j]);
		}
	}          //以数组形式将数塔输入

	for (j = 0; j < n; j++) {
		addmax[n - 1][j] = data[n - 1][j];
	}        //将数塔最底层数据传给addmax数组

	for (i = n - 2; i >= 0; i--) {
		for (j = 0; j <= i; j++) {

			if (addmax[i + 1][j] > addmax[i + 1][j + 1]) {
				addmax[i][j] = data[i][j]+addmax[i + 1][j];//求最大和
				path[i][j] = j;//标记路径
			}

			else {
				addmax[i][j] = data[i][j]+addmax[i + 1][j + 1];
				path[i][j] = j + 1;
			}
		}
	}
	printf("%d", addmax[0][0]);
	printf("[%d", data[0][0]);

	j = path[0][0];
	for (i = 1; i < n; i++) {
		printf("-->%d", data[i][j]);
		j = path[i][j];
	}

	printf("]");
	return 0;
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值