1. 程式人生 > >LightOJ 1422 Halloween Costumes(區間dp)

LightOJ 1422 Halloween Costumes(區間dp)

題意:

題意:給你n天分別要穿的衣服編號,可以套著穿,但是一旦脫下來就不能再穿了,問這n天最少要準備幾件衣服。

思路:

(很少做區間dp),dp[i][j]表示i-j天最少穿的衣服。

從後往前每次更新i時,dp[i][j]預設等於dp[i+1][j],預設和之前衣服都不一樣。

然後在i-j之間找與i相同衣服,如果有的話,更新,就是直到k一直不脫,這樣在k時就可以一直脫到i,用i的衣服就行了

#include <bits/stdc++.h>
using namespace std;
const int maxn = 109;
int num[maxn];
int dp[maxn][maxn];
int main()
{
    int m,n,t;
    int cnt=1;
    cin>>t;
    while(t--)
    {
        memset(dp,0,sizeof dp);
        cin>>n;
        for(int i=1; i<=n; i++)
            cin>>num[i];
        for(int i=n; i>=1; i--)
            for(int j=i; j<=n; j++)
            {
                dp[i][j]=dp[i+1][j]+1;
                for(int k=i+1; k<=j; k++)
                {
                    if(num[k]==num[i])
                    {
                        dp[i][j]=min(dp[i][j],dp[i+1][k-1]+dp[k][j]);
                    }
                }
            }
        printf("Case %d: %d\n",cnt++,dp[1][n]);
    }
    return 0;
}