light oj 1422 - Halloween Costumes -区间dp

题意:

给你n天需要穿的衣服的样式,每次可以套着穿衣服,脱掉的衣服就不能再用了(可以后续穿上的),问至少要带多少条衣服才能参加所有宴会。

思路:

区间dp,设dp[i][j]表示i~j天所需的最小数量。

考虑第j次穿不穿,如果穿的话那么 dp[i][j]=dp[i][j-1]+1;

如果不穿的话,那么需要有一个 k (i<=k<j),第j次和第k次穿的衣服相同,将k+1~j-1衣服套着穿后全部脱掉

状态转移方程:dp[i][j]=dp[i][k]+dp[k+1][j-1](别忘了之前的判定)

其实的话,还有一种写法,还没整理,大体上是从后往前先穿上再说的一种,还没整理

代码:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#define maxn 110
using namespace std;

int dp[maxn][maxn];
int a[maxn];
int n;

int main()
{
    int t,cas=0;
    cin>>t;
    while(t--)
    {
        memset(dp,0,sizeof(dp));
        cin>>n;
        for(int i=1; i<=n; i++)
            cin>>a[i];
        for(int i=1; i<=n; i++)
            dp[i][i]=1;
        for(int len=2; len<=n; len++)
        {
            for(int i=1; i<len; i++)
            {
                dp[i][len]=dp[i][len-1]+1;
                for(int k=i; k<len; k++)
                    if(a[k]==a[len])
                        dp[i][len]=min(dp[i][len],dp[i][k]+dp[k+1][len-1]);
            }
        }

        printf("Case %d: %d\n",++cas,dp[1][n]);
    }
}

猜你喜欢

转载自blog.csdn.net/wentong_Xu/article/details/82194654