当前位置:   article > 正文

动态规划-C语言解决数塔问题_数塔问题算法c语言

数塔问题算法c语言

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

一个示例:

算法思想

输入:二维数组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)位置。

  1. #define _CRT_SECURE_NO_WARNINGS 1
  2. #include<stdio.h>
  3. #include<math.h>
  4. int main() {
  5. int i, j;
  6. int n;
  7. printf("请输入数塔层数:");
  8. scanf("%d", &n);
  9. int data[10][10];
  10. int addmax[10][10];
  11. int path[10][10];
  12. printf("请输入数塔:\n");
  13. for (i = 0; i < n; i++) {
  14. for (j = 0; j <= i; j++) {
  15. scanf("%d", &data[i][j]);
  16. }
  17. } //以数组形式将数塔输入
  18. for (j = 0; j < n; j++) {
  19. addmax[n - 1][j] = data[n - 1][j];
  20. } //将数塔最底层数据传给addmax数组
  21. for (i = n - 2; i >= 0; i--) {
  22. for (j = 0; j <= i; j++) {
  23. if (addmax[i + 1][j] > addmax[i + 1][j + 1]) {
  24. addmax[i][j] = data[i][j]+addmax[i + 1][j];//求最大和
  25. path[i][j] = j;//标记路径
  26. }
  27. else {
  28. addmax[i][j] = data[i][j]+addmax[i + 1][j + 1];
  29. path[i][j] = j + 1;
  30. }
  31. }
  32. }
  33. printf("%d", addmax[0][0]);
  34. printf("[%d", data[0][0]);
  35. j = path[0][0];
  36. for (i = 1; i < n; i++) {
  37. printf("-->%d", data[i][j]);
  38. j = path[i][j];
  39. }
  40. printf("]");
  41. return 0;
  42. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/519288
推荐阅读
相关标签
  

闽ICP备14008679号