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;
}
时间: 2024-10-10 21:47:37

tyvj1106 登山的相关文章

1996:登山

1996:登山 总时间限制:  5000ms 内存限制:  131072kB 描述 五一到了,PKU-ACM队组织大家去登山观光,队员们发现山上一个有N个景点,并且决定按照顺序来浏览这些景点,即每次所浏览景点的编号都要大于前一个浏览景点的编号.同时队员们还有另一个登山习惯,就是不连续浏览海拔相同的两个景点,并且一旦开始下山,就不再向上走了.队员们希望在满足上面条件的同时,尽可能多的浏览景点,你能帮他们找出最多可能浏览的景点数么? 输入 Line 1: N (2 <= N <= 1000) 景点

印度夫妻登山事件引发的感慨

印度夫妻登山事件引发的感慨 笔者的最大的爱好之一是阅读,这个阅读不单单指看书,也包括观看环球新闻,杂志天下等节目.观看杂志天下.<杂志天下>是江西卫视的一档新闻类脱口秀节目,由林白(林中白狼)创办主持,现为廖杰主持,周一至周五中午12:40播出.从07年到现在已经快10年了.是笔者至今为止最喜爱的节目之一.节目内容不谈政_治,专注生活的方方面面.该节目的名言:读杂志,观天下,杂志话题多,咱们明天中午接着说.那笔者就说说这个不谈政治的节目却引发的政治问题.(这个问题下文详细介绍,同时该问题与该节

登山计划

2015年计划登山地点: 2015年03月 奥林匹克森林公园 2015年04月 植物园 2015年05月 神堂峪 2015年06月 松山 2015年07月 雁西湖 2015年08月 百花山 2015年09月 玉渡山 2015年10月 云蒙山 2015年11月 凤凰岭

本人工作性质已改变,不再从事全职程序员,回归登山行摄领队

本人工作性质已改变,不再从事全职程序员,回归登山行摄领队. 喜马拉雅行摄:http://www.himalaya-cross.com 个人网站:http://www.liangyichen.com

java线程例子登山

Through its implementation, this project will familiarize you with the creation and execution of threads, and with the use of the Thread class methods. In order to synchronize the threads you will have to use (when necessary), run( ), start( ), curre

[数学][dp] Jzoj P4236 登山

Description 恶梦是一个登山爱好者,今天他来到了黄山.俗话说的好,不走回头路.所以在黄山,你只能往前走,或者往上走.并且很显然的是,当你走到山脊的时候,你不能够往上走,你只能往前走一步再往上走.抽象一点而言就是,你可以把黄山视为一个N * N格点图,恶梦从(0,0)开始出发,要走到(N,N).当他走到位置(x,y)的时候,它可以往(x + 1,y),或(x,y+1)走.并且当他走到(x,x)的时候,由于他已经处在了山脊上,所以他不能够往(x,x+1)方向上走.当恶梦兴致勃勃准备开始爬山

【题解】跳伞登山赛

题目描述 某山区有高高低低的n个山峰,根据海拔高度的不同,  这些山峰由低到高进行了1到n编号. 有m条只能单向通行的羊肠小道连接这些山峰.现在,这里要举行一场跳伞登山赛,选手们伞降到某山峰后,再通过山间小道向属于自己的最高峰进军. 小明也参加了这次比赛,你能否告诉他,从任意一座山峰出发所能到达的最高峰编号是多少? 输入输出格式 输入格式 输入共m+1行. 第1行为2个整数n.m,用一个空格隔开,表示山峰总数和道路总数. 接下来m行,每行2个整数,用一个空格隔开,表示一条道路的起点和终点山峰编号

登山(LIS变形)

登山(LIS变形) 注意读题:不连续两个相同海拔,所以要么严格递增,要么严格递减 AC_Code 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <string> 5 #include <cmath> 6 #include <cstdlib> 7 #include <queue> 8 #include <vector&

那些年,登山徒步记录,立贴

2017年 02月12日 25KM 牛木外线 以上运动数据参见:乐动力当天公里数据为准. 其他运动参见:KEEP训练软件(训练.跑步)