博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
76.数塔问题
阅读量:4983 次
发布时间:2019-06-12

本文共 1446 字,大约阅读时间需要 4 分钟。

【例2数塔问题(IOI1994有形如图所示的数塔,从顶部出发,在每一结点可以选择向左走或是向右走,一起走到底层,要求找出一条路径,使路径上的值最大。
解法一(逆推法) 
算法分析
        贪心法往往得不到最优解:本题若采用贪心法则:13-11-12-14-13,其和为63,但存在另一条路:13-8-26-15-24,其和为86
        贪心法问题所在:眼光短浅。
        动态规划求解:动态规划求解问题的过程归纳为:自顶向下的分析,自底向上计算。
        其基本方法是:
        划分阶段:按三角形的行,划分阶段,若有n行,则有n-1个阶段。
        A.从根结点13出发,选取它的两个方向中的一条支路,当到倒数第二层时,每个结点其后继仅有两个结点,可以直接比较,选择最大值为前进方向,从而求得从根结点开始到底端的最大路径。
        B.自底向上计算:(给出递推式和终止条件)
        从底层开始,本身数即为最大数;
        倒数第二层的计算,取决于底层的数据:12+6=1813+14=2724+15=3924+8=32
        倒数第三层的计算,取决于底二层计算的数据:27+12=3939+7=4639+26=65
        倒数第四层的计算,取决于底三层计算的数据:46+11=5765+8=73
        最后的路径:13——8——26——15——24
        C.数据结构及算法设计
        图形转化:直角三角形,便于搜索:向下、向右
        用三维数组表示数塔:a[x][y][1]表示行、列及结点本身数据,a[x][y][2]够取得最大值,a[x][y][3]表示前进的方向——0向下,1向右;
        算法:
        数组初始化,输入每个结点值及初始的最大路径、前进方向为0
        从倒数第二层开始向上一层求最大路径,共循环N-1次;
        从顶向下,输出路径:究竟向下还是向右取决于列的值,若列的值比原先1则向右,否则向下。
代码:
#include
using namespace std;
#include
int n,a[1002][1002][4];
#include
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
 for(int j=1;j<=i;++j)
 {
  scanf("%d",&a[i][j][1]);
  a[i][j][2]=a[i][j][1];//a[i][j][1]储存原数,a[i][j][2]储存这一行到最后一行的最大值 
  a[i][j][3]=0;
 }
for(int i=n-1;i>=1;--i)
 for(int j=1;j<=i;++j)
 {
  if(a[i+1][j][2]>a[i+1][j+1][2])
  {
  a[i][j][2]+=a[i+1][j][2];
  a[i][j][3]=0;//a[i][j][3]用于记录下一行这一行的列数之差,用于输出路径 
 }
else {
a[i][j][2]+=a[i+1][j+1][2];
a[i][j][3]=1;
}
 }
printf("max = %d\n",a[1][1][2]);
  int y=1;
  for(int i=1;i<=n-1;++i)
  {
  printf("%d->",a[i][y][1]);
  y+=a[i][y][3];
   }
   printf("%d\n",a[n][y][1]);
return 0;
}

转载于:https://www.cnblogs.com/c1299401227/p/5370743.html

你可能感兴趣的文章
Python中Web框架编写学习心得
查看>>
dataTable/dataSet转换成Json格式
查看>>
asp.net core模块学习
查看>>
MySQL远程连接不上的解决方法
查看>>
如何使用JMeter从文件中提取数据
查看>>
AndroidBase基础类文档
查看>>
使用delphi 开发多层应用(十九) ios通过soap 访问kbmmw服务器
查看>>
三大特征 封装 继承 多态
查看>>
Python 3 函数分类
查看>>
通过.frm表结构和.ibd文件恢复数据
查看>>
R语言之——字符串处理函数
查看>>
架构师速成5.1-小学gtd进阶
查看>>
Spring-aop(一)
查看>>
ucos在xp平台下开发环境搭建
查看>>
python基础入门while循环 格式化 编码初识
查看>>
cmake方式使用vlfeat
查看>>
windows下用纯C实现一个简陋的imshow:基于GDI
查看>>
struts2 自定义类型转换器
查看>>
nginx 服务器
查看>>
cocos2d-x xna在有vs2012和vs2010的情况下的环境部署
查看>>