码迷,mamicode.com
首页 > 其他好文 > 详细

LightOJ 1422 (区间DP)

时间:2014-10-25 14:28:54      阅读:249      评论:0      收藏:0      [点我收藏+]

标签:style   http   color   io   os   ar   for   strong   sp   

题目链接http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27130

题目大意:按顺序去参加舞会。每个舞会对衣服都有要求。可以连续穿好多件衣服。需要时候就脱下来,但是一旦脱下来,这件衣服就报废了。问最少需要几件衣服。

解题思路

很难想出这题是个区间DP。

DP边界:

dp[i][i]=1。也就是说每个舞会换件衣服。当然这个不是最优的。

对于dp[i][j]:

如果cos[i]=cos[j],dp[i][j]=dp[i][j-1],很明显i的衣服穿在最底,在j的时候就能拿出来再用了。这是第一步优化。

之后枚举中间点k,注意(i<=k<j),

如果cos[i]=cos[k],那么k的衣服就是i的衣服了。那么dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j])

注意这里是dp[i][k],而不是dp[i][k-1]。

 

#include "cstdio"
#include "cstring"
#include "iostream"
using namespace std;
#define maxn 105
#define inf 0x3f3f3f3f
int cos[105],dp[105][105];
int main()
{
    //freopen("in.txt","r",stdin);
    int T,n,no=0;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++) scanf("%d",&cos[i]);
        for(int i=1;i<=n;i++) dp[i][i]=1;
        for(int p=1;p<=n;p++)
        {
            for(int i=1;i<=n;i++)
            {
                int j=i+p;
                dp[i][j]=inf;
                if(cos[i]==cos[j]) dp[i][j]=dp[i][j-1];
                for(int k=i;k<j;k++)
                    if(cos[i]==cos[k]) dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]);
            }
        }
        printf("Case %d: %d\n",++no,dp[1][n]);
        memset(dp,0,sizeof(dp));
    }
}

 

LightOJ 1422 (区间DP)

标签:style   http   color   io   os   ar   for   strong   sp   

原文地址:http://www.cnblogs.com/neopenx/p/4050003.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!