题解 | #最小花费#

最小花费

https://www.nowcoder.com/practice/e6df3e3005e34e2598b9b565cfe797c9

解题思路:

dfs(i,j):表示从i站到j站的最少花费

从i到j有两种方法:

(1)如果i到j站之间距离小于l3则可之间前往

(2)如果大于l3,则尝试选取一个中转站k,将dfs(i,j)问题转换为子问题dfs(i,k)和dfs(k,j),枚举每一个k,k的范围是i<k<j

最终递推公式为

dfs(i,j)=min(prices(i,j),min(dfs(i,k)+dfs(k,j)))

再在回溯的基础上增加记忆化搜索

#include <algorithm>
#include <climits>
#include <functional>
#include <iostream>
#include <vector>
using namespace std;


int main() {
    int l1, l2, l3;
    int c1, c2, c3;
    while (cin >> l1 >> l2 >> l3 >> c1 >> c2 >> c3) {
        int startStation, endStation;
        cin >> startStation >> endStation;
        int n;
        cin >> n;
        vector<int> stationsLength(n, 0);
        stationsLength[0] = 0;
        for (int i = 1; i < n; i++) {
            cin>>stationsLength[i];
        }

        function<int(int)> getPrice = [&] (int len) -> int{
            return len > l3 ? INT_MAX : (len > l2 ? c3 : ( len > l1 ? c2 : c1));
        };


        vector<vector<int>> dp(n, vector<int>(n, -1));

        function<int(int, int)> dfs = [&] (int i, int j) -> int{
            if (i==j) {
                return 0;
            }
            if (dp[i][j] == -1) {
                dp[i][j] = getPrice(stationsLength[j] - stationsLength[i]);
                for (int k = i + 1; k < j; k++) {
                    dp[i][j] = min(dp[i][j], dfs(i, k) + dfs(k, j));
                }
            }
            return dp[i][j];
        };


        /*vector<vector<int>> dp(n,vector<int>(n,INT_MAX));

        for (int i=n-1; i>=0; i--) {
            dp[i][i]=0;
            for (int j=i+1; j<n; j++) {
                dp[i][j]=getPrice(stationsLength[j]-stationsLength[i]);
                for (int k=i+1; k<j; k++) {
                    dp[i][j]=min(dp[i][j], dp[i][k]+dp[k][j]);
                }


            }
        }*/


        cout << dfs(startStation - 1, endStation - 1) << endl;
    }
}
// 64 位输出请用 printf("%lld")

}// 64 位输出请用 printf("%lld")

全部评论

相关推荐

哈哈哈哈哈哈哈哈哈哈这个世界太美好了
凉风落木楚山秋:毕业出路老师不管,你盖个章他好交差就完事了,等你盖完毕业了就不关他事情了
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-10 14:10
啊啊啊啊好幸福,妈妈是我找工作发疯前的一束光
榕城小榕树:你是我见过最幸福的牛客男孩
点赞 评论 收藏
分享
嵐jlu:我是山川🐔里🐔🧱的,阿里系简历全过; 你这简历一看就还是半成品啊,没有荣誉经历奖项什么的吗?
投递阿里巴巴集团等公司10个岗位
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
05-28 12:15
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-07 11:20
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务