zoukankan      html  css  js  c++  java
  • 晴天小猪历险记之Hill

    背景 Background 

             在很久很久以前,有一个动物村庄,那里是猪的乐园(^_^),村民们勤劳、勇敢、善良、团结……

      不过有一天,最小的小小猪生病了,而这种病是极其罕见的,因此大家都没有储存这种药物。所以晴天小猪自告奋勇,要去采取这种药草。于是,晴天小猪的传奇故事便由此展开……

    描述 Description  

             这一天,他来到了一座深山的山脚下,因为只有这座深山中的一位隐者才知道这种药草的所在。但是上山的路错综复杂,由于小小猪的病情,晴天小猪想找一条需时最少的路到达山顶,但现在它一头雾水,所以向你求助。

      山用一个三角形表示,从山顶依次向下有1段、2段、3段等山路,每一段用一个数字T(1<=T<=100)表示,代表晴天小猪在这一段山路上需要爬的时间,每一次它都可以朝左、右、左上、右上四个方向走(**注意**:在任意一层的第一段也可以走到本层的最后一段或上一层的最后一段)。

      晴天小猪从山的左下角出发,目的地为山顶,即隐者的小屋。

    输入格式 Input Format

             第一行有一个数n(2<=n<=1000),表示山的高度。

      从第二行至第n+1行,第i+1行有i个数,每个数表示晴天小猪在这一段山路上需要爬的时间。

    输出格式 Output Format    

            一个数,即晴天小猪所需要的最短时间。

    题目叙述有问题,要来回 DP 2次

     1 #include<iostream>
     2 using namespace std;
     3 
     4 int n,g[1101][1101];
     5 int f[1101][1101];
     6 
     7 int main()
     8 {
     9     cin>>n;
    10     for(int i=0;i<=n+5;++i)
    11     for(int j=0;j<=n+5;++j)
    12     g[i][j]=f[i][j]=0xfffffff; 
    13     
    14     for(int i=1;i<=n;++i)
    15     for(int j=1;j<=i;++j)
    16     cin>>g[i][j];
    17     
    18     f[n][1]=g[n][1];
    19     
    20     for(int i=n;i>=1;--i)
    21     { //第一次dp 
    22       f[i][1]=min(f[i][i]+g[i][1],f[i][1]);
    23       f[i][1]=min(f[i][1],f[i+1][i+1]+g[i][1]); 
    24       for(int j=1;j<=i;++j)
    25       {
    26         f[i][j]=min(f[i][j],f[i][j-1]+g[i][j]);    
    27         f[i][j]=min(f[i][j],min(f[i+1][j],f[i+1][j+1])+g[i][j]); 
    28               } 
    29       
    30       
    31       f[i][i]=min(f[i][i],f[i][1]+g[i][i]); 
    32       f[i][i]=min(f[i][i],f[i+1][1]+g[i][i]);
    33        
    34       for(int j=i-1;j>=1;--j)
    35       f[i][j]=min(f[i][j],f[i][j+1]+g[i][j]);
    36       
    37       
    38       //第二次dp 
    39       f[i][1]=min(f[i][i]+g[i][1],f[i][1]);
    40       f[i][1]=min(f[i][1],f[i+1][i+1]+g[i][1]); 
    41       for(int j=1;j<=i;++j)
    42       {
    43         f[i][j]=min(f[i][j],f[i][j-1]+g[i][j]);    
    44         f[i][j]=min(f[i][j],min(f[i+1][j],f[i+1][j+1])+g[i][j]); 
    45               } 
    46       
    47       f[i][i]=min(f[i][i],f[i][1]+g[i][i]); 
    48       f[i][i]=min(f[i][i],f[i+1][1]+g[i][i]);
    49             } 
    50     
    51     cout<<f[1][1]<<endl; 
    52     return 0; 
    53     
    54     } 
  • 相关阅读:
    oracle 时间加减法 与C#
    BCB编写DLL
    面试题:产生一个长度为100的数组,为数组中的每一项随机填充1100之间的数并且保证不重复 (C#实现)
    公司内部员工运算测试题
    MVP 模式是否应该这样修改?
    MVP 模式是否应该这样修改2?
    面试题:一列数的规则如下: 1、1、2、3、5、8、13、21、34...... 求第30位数是多少, 用递归算法实现(C#)
    使用游标进行跨数据库循环更新
    Hive 安装配置流程
    Scala的基本语法:集合应用
  • 原文地址:https://www.cnblogs.com/noip/p/2623324.html
Copyright © 2011-2022 走看看