问题描述
解题报告
d
p
[
i
]
dp[i]
dp[i] 表示截止于
i
i
i 天的最低消费。
如果第
i
i
i 天没有旅行计划,则
d
p
[
i
]
=
d
p
[
i
−
1
]
dp[i]=dp[i-1]
dp[i]=dp[i−1];
如果第
i
i
i 天有旅行计划,则判断1天前选择一张为期1天的通行证、7天前选择为期7天的通行证、30天前选择为期30天的通行证 哪一种更为合适。
如果days数组为[1,2,3,4,5,6,7] ,则:
d
p
[
0
]
=
0
;
d
p
[
1
]
=
2
;
d
p
[
2
]
=
2
;
d
p
[
3
]
=
4
;
d
p
[
4
]
=
4
;
d
p
[
5
]
=
6
;
d
p
[
6
]
=
6
;
d
p
[
7
]
=
7
;
dp[0]=0;\\ dp[1]=2;\\ dp[2]=2;\\ dp[3]=4;\\ dp[4]=4;\\ dp[5]=6;\\ dp[6]=6; \\ dp[7]=7;
dp[0]=0;dp[1]=2;dp[2]=2;dp[3]=4;dp[4]=4;dp[5]=6;dp[6]=6;dp[7]=7;
实现代码
class Solution {
public:
int mincostTickets(vector<int>& days, vector<int>& costs) {
vector<int>dp(366,-1);
int n=days.size();
dp[0]=0;
for(int i=0;i<n;i++){
dp[days[i]]=0;
}
for(int i=1;i<=days[n-1];i++){
if(dp[i]==-1)
dp[i] = dp[i-1];
else{
int tmp = dp[i-1] + costs[0];
tmp = min(tmp, (i>=7?dp[i-7]:0) + costs[1]);
tmp = min(tmp, (i>=30?dp[i-30]:0) +costs[2]);
dp[i] = tmp;
}
}
return dp[days[n-1]];
}
};