zoukankan      html  css  js  c++  java
  • tyvj1106 登山

    背景

        在很久很久以前,有一个动物村庄,那里是猪的乐园(^_^),村民们勤劳、勇敢、善良、团结……
        不过有一天,最小的小小猪生病了,而这种病是极其罕见的,因此大家都没有储存这种药物。所以晴天小猪自告奋勇,要去采取这种药草。于是,晴天小猪的传奇故事便由此展开……

    描述

        这一天,他来到了一座深山的山脚下,因为只有这座深山中的一位隐者才知道这种药草的所在。但是上山的路错综复杂,由于小小猪的病情,晴天小猪想找一条需时最少的路到达山顶,但现在它一头雾水,所以向你求助。
        山用一个三角形表示,从山顶依次向下有1段、2段、3段等山路,每一段用一个数字T(1<=T<=100)表示,代表晴天小猪在这一段山路上需要爬的时间,每一次它都可以朝左、右、左上、右上四个方向走(**注意**:在任意一层的第一段也可以走到本层的最后一段或上一层的最后一段,且在任意一层的最后一段也可以走到本层的第一段或上一层的第一段)。
        晴天小猪从山的左下角出发,目的地为山顶,即隐者的小屋。

    输入格式

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

    输出格式

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

    测试样例1

    输入



    2 3 
    4 5 6 
    10 1 7 8 
    1 1 4 5 6

    输出

    10

    备注

    在山的两侧的走法略有特殊,请自己模拟一下,开始我自己都弄错了……Sunnypig
    /*
    每一次它都可以朝左、右、左上、右上四个方向走
    
    !!!!!!!!!!!!!!!!
    
    每一次它都可以朝左、右、左上、上四个方向走
    
    不是右上是上!!!!!!!!!!!!!!!!
    */
    
    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int maxn = 987654321;
    int n,h[1050][1050],dp[1050][1050];
    int main(){
        cin>>n;
        for(int i = 1;i <= n;i++){
            for(int j = 1;j <= i;j++){
                scanf("%d",&h[i][j]);
             }
        }
        for(int i = 0;i <= n + 1;i++){
            for(int j = 0;j <= 1000;j++){
                dp[i][j] = maxn;
            }
        }
        dp[n][1] = 0;
        for(int i = n;i >= 1;i--){
            for(int j = 1;j <= i;j++){
                if(j == 1) dp[i][j] = min(min(dp[i][j],dp[i+1][j] + h[i+1][j]),min(dp[i+1][i+1] + h[i+1][i+1],dp[i+1][j+1] + h[i+1][j+1]));
                else if(j == i) dp[i][j] = min(dp[i][j],min(dp[i+1][1] + h[i+1][1],min(dp[i+1][j+1] + h[i+1][j+1],dp[i+1][j] + h[i+1][j])));
                else dp[i][j] = min(dp[i][j],min(dp[i+1][j+1] + h[i+1][j+1],dp[i+1][j] + h[i+1][j]));
            }
            dp[i][1] = min(dp[i][1],dp[i][i] + h[i][i]);
            for(int j = 2;j <= i;j++) dp[i][j] = min(dp[i][j],dp[i][j-1] + h[i][j-1]);
            dp[i][n] = min(dp[i][n],dp[i][1] + h[i][1]);
            for(int j = n - 1;j >= 1;j--) dp[i][j] = min(dp[i][j],dp[i][j+1] + h[i][j+1]);
        }
        cout<<dp[1][1] + h[1][1];
        return 0;
    }
  • 相关阅读:
    11.【原创】Object.keys()的一般用法
    5. 【原创】table设置text-overflow: ellipsis;(超出范围显示...)不生效
    12.【转载】vscode默认常用快捷键
    13.【原创】JS读取apk安装包的信息,做应用上传
    11.【原创】chrom文件上传后,手动释放内存
    26.Mysql "truncate"与"delete"的区别
    25.【转载】Mysql timestamp类型字段的CURRENT_TIMESTAMP与ON UPDATE CURRENT_TIMESTAMP属性
    bof
    ctf Wiener tricky
    分解大素数
  • 原文地址:https://www.cnblogs.com/hyfer/p/5791395.html
Copyright © 2011-2022 走看看