LightOJ1422->区间DP

博客详细介绍了如何使用区间动态规划(DP)解决LightOJ1422问题。该问题涉及在给定天数内确定最少需要的衣服数量,衣服一旦脱下就不能再穿。博主给出了问题的解释、解题思路和代码实现,通过从小到大的区间扩展来计算最少所需衣服件数。

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

LightOJ1422->区间DP

题意:

给你n天要穿的衣服,可以套着穿,但是一旦脱下来就不能再穿,问这n天最少需要准备多少件衣服

题解:

题目类型:区间DP

dp[i][j]表示区间[i,j]最少需要多少件衣服
(从最小的区间向最大的区间扩展)

如果第i件衣服不能重复利用,则:
dp[i][j] = dp[i+1][j] + 1

如果在之后的区间[i+1 , j]中第k件衣服恰好和第i件衣服相同, 则:
dp[i][j] = min(dp[i][j] , dp[i][k-1]+dp[k+1][j]) ;


代码:
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std ;
#define MAX 120
int dp[MAX][MAX] , cloth[MAX] ;
int main()
{
    int T ,n;
    cin >> T ;
    for(int cas = 1 ; cas <= T ; cas ++)
    {
        cin >> n ;
        for (int i = 1 ; i <= n ; i ++) cin >> cloth[i] ;
        memset(dp , 0 , sizeof(dp)) ;
        for (int i = 1 ; i <= n ; i ++) dp[i][i] = 1 ;
        for (int j = 1; j < n; j++)
        {
            for(int i = 1 ; i + j <= n ; i ++)
            {
                dp[i][i+j] = dp[i+1][i+j] + 1 ;
                for(int k = i+1 ; k<= i+j ; k ++)
                {
                    if(cloth[k] == cloth[i])
                        dp[i][i+j] = min(dp[i][i+j] , dp[i][k-1] + dp[k+1][i+j]) ;
                }
            }
        }
        printf("Case %d: %d\n", cas , dp[1][n]);
    }
    return 0 ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值