1042 最低票价

#include<iostream>
#include<algorithm>
#include<iomanip>
#include<climits>
using namespace std;

// leetcode 983 Minimum Cost For Tickets.
// https://leetcode.com/problems/minimum-cost-for-tickets/

int func(int days[], int costs[], int len, int n_costs)
{
    // dp[i]表示前i天旅行的费用
    int dp[366];
    for(int i=0;i<366;i++)
    {
        dp[i] = INT_MAX;
    }
    // 前0天,没有旅行,没有费用
    dp[0] = 0;
    // 扫描days数组的下标
    int idx = 0;
    for(int i=1;i<366;i++)
    {
        // 第i天不旅行,防止idx下标出界
        // idx>=len必须放在前面,先进行判断,否则会造成缓冲区溢出
        if(days[idx] != i || idx>=len)
        {
            // 费用和之前保持不变
            dp[i] = dp[i-1];
        }
        // 第i天旅行
        else
        {
            // 三种费用依次比较,注意防止i-1,i-7,i-30出了边界
            dp[i] = min(dp[i], ( i>=1 ? dp[i-1] : 0 ) + costs[0]);  // 一天的费用
            dp[i] = min(dp[i], ( i>=7 ? dp[i-7] : 0) + costs[1]);  // 七天的费用
            dp[i] = min(dp[i], ( i>=30 ? dp[i-30] : 0) + costs[2]);  // 一个月的费用
            // 下一次旅行的日期
            idx++;
        }
    }
    return dp[365];
}

int main()
{
    const int n_costs = 3;
    int n_test;
    cin>>n_test;
    for(int i=0;i<n_test;i++)
    {
        int len;
        cin>>len;
        int days[len];
        int costs[n_costs];
        for(int j=0;j<len;j++)
        {
            cin>>days[j];
        }
        for(int j=0;j<n_costs;j++)
        {
            cin>>costs[j];
        }
        cout<<func(days, costs, len, n_costs)<<endl;
    }
}