晴天小猪历险记之Hill---Dijkstra算法

Problem A. 晴天小猪历险记之Hill

时间限制 1000 ms

内存限制 128 MB

题目描述

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

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

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

输入数据

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

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

输出数据

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

样例输入
复制代码
5
1
2 3
4 5 6
10 1 7 8
1 1 4 5 6
样例输出
复制代码
10

感觉题目不是很完善,测试样例里应该包含了 每一层的最后一段能到达第一段或者上一层的第一段

代码:

cpp 复制代码
#include <bits/stdc++.h>
using namespace std;

using pii=pair<int,int>;
using ll=long long;
const int INF=1e9;

struct Node
{
    int r,c;
    int d;
    bool operator<(Node const& other)const
    {
        return d>other.d;//for min-heap
    }
};


int main()
{

        int n;
        cin>>n;

        vector<vector<int>> T(n+1);

        for(int r=1;r<=n;r++)
        {
            T[r].resize(r+1);
            for(int c=1;c<=r;c++)
            {
                cin>>T[r][c];
            }
        }

        vector<vector<int>>dist(n+1);
        for(int r=1;r<=n;r++)
        {
            dist[r].assign(r+1,INF);//r+1长度,填充inf值
        }

        dist[n][1]=T[n][1];
        priority_queue<Node>pq;
        pq.push({n,1,dist[n][1]});

        //松弛操作
        auto relax = [&](int r, int c, int nd)
        {
        if (r < 1 || r > n) return;
        if (c < 1 || c > r) return;
        if (nd < dist[r][c]) {
            dist[r][c] = nd;
            pq.push({r, c, nd});
            }
        };

        while(!pq.empty())
        {
            Node cur=pq.top();
            pq.pop();
            int r=cur.r;int c=cur.c;int d=cur.d;
            if(d!=dist[r][c])
            {
                continue;
            }

            if(r==1&&c==1)
            {
                break;
            }
            //左
            if(c==1)
            {
                relax(r,r,d+T[r][r]);
            }
            else
            {
                relax(r,c-1,d+T[r][c-1]);
            }
            //右
            if(c<r)
            {
                relax(r,c+1,d+T[r][c+1]);
            }
            else relax(r, 1, d + T[r][1]);
            //左上
            if(r>1)
            {
                if(c==1)
                {
                    relax(r-1,r-1,d+T[r-1][r-1]);
                }
                else
                {
                    relax(r-1,c-1,d+T[r-1][c-1]);
                }
            }
            //右上
            if(r>1)
            {
                if(c<r)
                {
                    relax(r-1,c,d+T[r-1][c]);
                }
                else
                {
                    relax(r-1,1,d+T[r-1][1]);
                }
            }
            
        }


    cout<<dist[1][1]<<"\n";


}
相关推荐
想唱rap18 小时前
应用层协议与序列化
linux·运维·服务器·网络·数据结构·c++·算法
重生之我是Java开发战士18 小时前
【笔试强训】Week3:重排字符串,分组,DNA序列
算法
We་ct18 小时前
LeetCode 97. 交错字符串:动态规划详解
前端·算法·leetcode·typescript·动态规划
热心网友俣先生18 小时前
2026年第二十三届五一数学建模竞赛B题四问参考答案+多算法对比
算法·数学建模
无敌昊哥战神18 小时前
【LeetCode 37】解数独 (Sudoku Solver) —— 回溯法详解 (Python/C/C++)
c语言·c++·python·算法·leetcode
风筝在晴天搁浅18 小时前
LeetCode 162.寻找峰值
算法·leetcode
itzixiao18 小时前
L1-067 洛希极限(10分)[java][python]
java·开发语言·算法
jinyishu_18 小时前
链表经典OJ题
c语言·数据结构·算法·链表
葫三生18 小时前
三生原理文章被AtomGit‌开源社区收录的意义探析?
人工智能·深度学习·神经网络·算法·搜索引擎·开源·transformer
AI进化营-智能译站18 小时前
ROS2 C++开发系列15-模板实现通用算法|宏定义ROS2调试开关|一次编码适配多平台
java·c++·算法·ai