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]; } }