小猪上山【动态规划】

问题 H: 小猪上山

时间限制: 1 Sec  内存限制: 128 MB

题目描述

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

输入

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

输出

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

样例输入

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

样例输出

10

提示

在山的两侧的走法略有特殊,请自己模拟一下,开始我自己都弄错了……


 

#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int dp[1002][1002];
int a[1002][1002];
int main()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= i; j++)cin >> a[i][j];
    }
    memset(dp, 60, sizeof(dp));
    dp[1][1] = a[1][1];
    
    for (int i = 2; i <= n; i++) {
        
        while (1) {
            bool flag = false;
            int temp;
            dp[i][0] = dp[i][i];
            dp[i][i + 1] = dp[i][1];
            for (int j = 1; j <= i; j++) {
                temp = min(min(min(min(dp[i - 1][j], dp[i - 1][j - 1]), dp[i][j]), dp[i][j+1]),dp[i][j-1]);
                //temp = min(dp[i][j], min(min(min(dp[i - 1][j], dp[i - 1][j - 1]), dp[i][j - 1]), dp[i][j + 1]));
                if (temp + a[i][j] < dp[i][j]) {
                    flag = true;
                    dp[i][j] = temp + a[i][j];
                }
            }
            if (flag == false)break;
        }
    }
    cout << dp[n][1];
    return 0;
}

原博主链接:https://blog.csdn.net/skywalker8/article/details/18818627

posted @ 2019-03-12 12:40  大帅本帅  阅读(29)  评论(0)    收藏  举报