LightOJ - 1422 Halloween Costumes ( 区间dp

本文介绍了一种基于区间动态规划的算法,用于解决特定条件下最少衣物携带数量的问题。该算法通过状态转移方程进行分段枚举,适用于需要考虑连续多天衣物搭配且不可重复使用的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给你 n 天需要穿的⾐服的样式,每次可以套着穿⾐服,脱掉的⾐服就不能再⽤了(可以再穿),问⾄少要带多少条⾐服才能参加所有宴会
这个题真的真的真的思考了挺长时间才勉强理解才能勉强,感觉和区间dp,,,
状态dp[i][j]dp[i][j] 表示iji−j之间需要的衣服数
考虑两种状态:
arr[i]==arr[j]arr[i]==arr[j] 说明和前一个状态衣服件数一样即可 dp[i][j]=dp[i][j1]dp[i][j]=dp[i][j−1]
分段进行枚举
如果arr[i]=arr[k]arr[i]=arr[k], 这个段的开始点和kk点衣服相同 考虑状态转移

dp[i][j]=min(dp[i][k]+dp[k+1][j])

#include <bits/stdc++.h>
using namespace std;

#define CLR(a,b)        memset(a, (b), sizeof(a))

const int MAXN = 2e2+10;

int dp[MAXN][MAXN];
int arr[MAXN];
/*


*/
int main(int argc, char const *argv[])
{
    int T, kk=0;
    scanf("%d",&T);
    while(T--) {
        int n;
        cin >> n;
        CLR(dp, 0x3f3f);
        for (int i = 1; i <= n; ++i) {
            cin >> arr[i];
            dp[i][i] = 1;
        }
        for (int len = 1; len < n; ++len) {
            for(int i = 1; i <= n; ++i) {
                int j = len+i;
                if(j > n) break;
                if(arr[i] == arr[j]) 
                    dp[i][j] = dp[i][j-1];
                for(int k = i; k < j; ++k) {
                    if(arr[i] == arr[k])
                        dp[i][j] = min(dp[i][j], dp[i][k]+dp[k+1][j]);
                }
            }
        }

        cout << "Case " << ++kk << ": " << dp[1][n] << endl;
    }

    return 0;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值