LightOJ 1422 Halloween Costumes(区间dp)

来源:互联网 发布:北京方便面的危害知乎 编辑:程序博客网 时间:2024/06/06 15:37
/*date: 2016/11/5writer: CN_swords题意:给你n天分别要穿的衣服,可以套着穿,但是一旦脱下来就不能再穿了,问这n天要准备几件衣服。题解:dp[i][j] 代表i天到j天最少需要准备的衣服;如果求dp[i][j],在(i+1,j)的区间内如果不考虑与i天一样的衣服,那么dp[i][j] = dp[i+1][j]+1;如果找到k天与i天一样,我们可以把i天的衣服一直保留到k天,那么dp[i][j] = dp[i+1][k-1]+dp[k][j];*/#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 105;int a[N];int dp[N][N];int main(){    int T,cas = 1;    scanf("%d",&T);    while(T--)    {        int n;        scanf("%d",&n);        for(int i = 1; i <= n; i++)            scanf("%d",&a[i]);        printf("Case %d: ",cas++);        memset(dp,0,sizeof(dp));        for(int i = 1; i <= n; i++)            dp[i][i] = 1;        for(int len = 1; len < n; len++)        {            for(int i = 1; i+len <= n; i++)            {                int l = i, r = i+len;                dp[l][r] = dp[l+1][r]+1;                for(int k = i+1; k <= r; k++)                {                    if(a[i] == a[k])                        dp[l][r] = min(dp[l][r],dp[l+1][k-1]+dp[k][r]);                }            }        }        printf("%d\n",dp[1][n]);    }    return 0;}
0 0
原创粉丝点击