思想,使用dp数组,dp[i]表示第i天的最小花费,初始化dp[0] = 0
#include <iostream>
#include <vector>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;
int get_mincost(vector<int> arr, vector<int> costs){
vector<int> dp(366,0);//dp[i]表示第i天的最小花费为多少元,故dp[0] = 0
for(int i = 1; i < 366; i++){
if(find(arr.begin(),arr.end(),i) != arr.end()){//i为游乐日期
if(i<3){//小于三日则只考虑一日游票
dp[i] = dp[i - 1] + costs[0];
}
else if(i < 7){//小于一周,多考虑三日票
dp[i] = min(dp[i - 1] + costs[0], dp[i - 3] + costs[1]);
}
else if(i < 30){//小于一个月,多考虑周票
dp[i] = min(dp[i - 1] + costs[0], dp[i - 3] + costs[1]);
dp[i] = min(dp[i], dp[i - 7] + costs[2]);
}
else{//小于一年,考虑月票
dp[i] = min(dp[i - 1] + costs[0], dp[i - 3] + costs[1]);
dp[i] = min(dp[i], dp[i - 7] + costs[2]);
dp[i] = min(dp[i], dp[i - 30] + costs[3]);
}
}
else{//i不为游玩日期
dp[i] = dp[i - 1];
}
}
return dp[365];
}
int main() {
vector<int> costs(4, 0);
for(int i = 0; i < 4; i++){
cin >> costs[i];
}
vector<int> playday;
int day;
while(cin >> day){
playday.push_back(day);
}
int pay = get_mincost(playday, costs);
cout << pay << endl;
}