zoukankan      html  css  js  c++  java
  • 76.数塔问题

    【例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 ",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 ",a[n][y][1]);
    return 0;
    }
  • 相关阅读:
    PHP Fatal error: Uncaught Error: Call to undefined function pcntl_fork().. 开启php pcntl扩展实现多进程
    php实现共享内存进程通信函数之_shm
    Centos下10000次循环测试php对Redis和共享内存(shm)读写效率
    php操作共享内存shmop类及简单使用测试(代码)
    作为phper既然了解共享内存函数shmop的使用方法,那么就必须要了解一下信号量是什么,以及信号量使用的代码案例
    php简单使用shmop函数创建共享内存减少服务器负载
    作为php了解一下共享内存的概念及优缺点
    给PHP开启shmop扩展实现共享内存
    Centos环境自写脚本查看使用php或nginx占用内存
    linux下查看和添加path环境变量
  • 原文地址:https://www.cnblogs.com/csgc0131123/p/5290314.html
Copyright © 2011-2022 走看看