LeetCode 983

https://leetcode-cn.com/problems/minimum-cost-for-tickets/

2020-05-06的每日一题

一个很典型的dp问题,果然细节决定一切啊。我在纸上写dp数组的时候已经寻找出来规律了,但是就是没想好怎么处理没有访问的日子和三张门票之间的关系。。dp还是太弱了。

class Solution {
    public int mincostTickets(int[] days, int[] costs) {
        int[] dp = new int[days[days.length-1] + 1];
        for(int i = 0; i < days.length; i++){
            //将会去旅游的日子置为-1以示区别。
            dp[days[i]] = -1;
        }
        for(int i = 1; i < dp.length; i++){
            //初始化abc,计算今天买1天票,7天票和30天票之后的最终票价。
            int a = costs[0];
            int b = costs[1];
            int c = costs[2];
            //如果当天不去旅游,直接套用上一天的答案即可。
            if(dp[i] == 0){
                dp[i] = dp[i-1];
            }else{
                a = dp[i-1] + costs[0];
                //使用判别式以检验越界问题
                if(i - 7 >= 0){
                    b = dp[i-7] + costs[1];
                }
                if(i - 30 >= 0){
                    c = dp[i-30] + costs[2];
                }
                //取3个之中最小的一个放入今天的票价中
                dp[i] = Math.min(Math.min(a,b),c);
            }
        }
        return dp[dp.length-1];
    }
}

 

posted @ 2020-05-06 11:22  ZJPang  阅读(151)  评论(0编辑  收藏  举报