一二三四五 上山打老虎

Leetcode-56双周赛<规定时间内到达终点的最小花费>(分层图最短路/DP)

链接:https://leetcode-cn.com/problems/minimum-cost-to-reach-destination-in-time/
思路:
方法1.f[i][j]表示第i时间到达j位置所需要的费用,状态转移方程是:f[i][y]=min(f[i][y],f[i-e[x][y]][x]+p[y]);
方法2:分层图最短路:

代码:

class Solution {
public:
        
    int minCost(int m, vector<vector<int>>& e, vector<int>& p) {
            int len=p.size();
            vector<vector<int>> f(m+5,vector<int>(len+5,0x3f3f3f3f));
            vector<pair<int,int>> s[1005];
            for(auto i:e){
                int x=i[0],y=i[1],w=i[2];
                s[x].emplace_back(y,w);
                s[y].emplace_back(x,w);
            }
            f[0][0]=p[0];
            for(int i=0;i<=m;i++){
                for(int j=0;j<len;j++){
                    if(f[i][j]==0x3f3f3f3f)continue;
                    for(auto [y,z]:s[j]){
                        if(i+z>m)continue;
                        f[i+z][y]=min(f[i+z][y],f[i][j]+p[y]);
                    }
                }
            }
            int ans=0x3f3f3f3f;
            for(int i=0;i<=m;i++){
                ans=min(ans,f[i][len-1]);
            }
            return ans==0x3f3f3f3f? -1:ans;
    }
};
posted @ 2021-07-11 10:29  黒川川  阅读(92)  评论(0)    收藏  举报