• 晴天小猪历险记之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     } 
  • 相关阅读:
    ansj分词原理
    于erlang依赖的linux调优
    Gearman
    生成具有三态背景图片的按钮
    tracert
    Wings 3D
    jira
    Erlang编程语言的一些痛点
    QTreeView 限制特定的深度、特定深度下的列 是否可以编辑
    QStandardItemModel角色控制及QTreeView添加不同的右键菜单
  • 原文地址:https://www.cnblogs.com/noip/p/2623324.html
Copyright © 2020-2023  润新知