前言:最简单的动态规划比如爬楼梯、斐波那契数列就不做举例分析了。我们来看一下场景相对复杂的题目。
确定状态 dp[i]表示到第i天所用的最少的cost
状态转移方程(这道题不难写)
dp[i]=dp[i-1] 如果在第i天没有travel
dp[i]= min {dp[i-1]+costs[0],dp[i-7]+costs[1],dp[i-30]+costs[2]}
初始条件和边界条件
Arrays.fiil(dp,Integer.MAX_VALUE)
dp[0]=0;
我们来看下这个表达式:dp[i-30] 如果i<30说明此时我们应该从第0天就买为期30天的票,而不是dp[负数]。
状态转移方程可以修改表示为如下:
dp[i]=dp[i-1] 如果在第i天没有travel
dp[i]= min {dp[i-1]+costs[0],dp[max{i-7,0}]+costs[1],dp[max{i-30,0}]+costs[2]}
代码如下:
class Solution {
public int mincostTickets(int[] days, int[] costs) {
if(days==null||days.length==0)return 0;
int maxday=days[days.length-1];
int []dp = new int [maxday+1];
int []req = new int [maxday+1];
for(int i=0;i<days.length;i++){
req[days[i]]=1;
}
Arrays.fill(dp,Integer.MAX_VALUE);
dp[0]=0;
for(int i=1;i<=maxday;i++){
if(req[i]==0){
dp[i]=dp[i-1];
}else{
dp[i]=Math.min(dp[i],dp[i-1]+costs[0]);
dp[i]=Math.min(dp[i],dp[Math.max(i-7,0)]+costs[1]);
dp[i]=Math.min(dp[i],dp[Math.max(i-30,0)]+costs[2]);
}
}
return dp[maxday];
}
}