Light OJ 1422 Halloween Costumes 区间DP基础题

Halloween Costumes

题目链接:

http://lightoj.com/volume_showproblem.php?problem=1422

题意:

Gappu想要去参加一些party,他去每个party都要把特定编号的服装穿在外边,他可以穿上或者脱掉服装(脱掉的服装不能再穿一次,但是可以穿一件相同编号新的服装,最近穿的服装会套在之前穿的服装的外边),问Gappu最少需要准备多少套服装。

题解:

设dp[i][j]为区间 i 到 j (设len为区间长度,j=i+len)内最少需要的服装数, 那么可以发现dp[i][j]可以由两种方式得到:

① dp[i][j]=dp[i][j-1]+1

② 找到一个点k,k在区间[i][j-1]内且party k需要的服装和party j需要的服装相同,则此时 dp[i][j]=dp[i][k]+dp[k+1][j-1](之所以是k+1是为了保证不会将party k所需要的服装脱掉)

取①和②的较小值就好了,dp[1][n]为终点状态

代码

#include<stdio.h>
const int N=101;
int p[N],dp[N][N];
int mmin(int x,int y)
{
  return x<y?x:y;
}
void solve()
{
  int T,n,Case=0;
  scanf("%d",&T);
  while(T--)
  {
    scanf("%d",&n);
    for(int i=1;i<=n;++i)
    {
      scanf("%d",&p[i]);
      dp[i][i]=1;
    }
    for(int len=1;len<n;++len)
    for(int i=1;i+len<=n;++i)
    {
      int j=i+len;
      dp[i][j]=dp[i][j-1]+1;
      for(int k=i;k<=j-1;++k)
      if(p[k]==p[j])
      {
        dp[i][j]=mmin(dp[i][j],dp[i][k]+dp[k+1][j-1]);
      }
    }
    printf("Case %d: %d\n",++Case,dp[1][n]);
  }
}
int main()
{
  solve();
  return 0;
}

时间: 2024-10-17 02:19:17

Light OJ 1422 Halloween Costumes 区间DP基础题的相关文章

Light OJ 1422 - Halloween Costumes(区间DP 最少穿几件)

http://www.cnblogs.com/kuangbin/archive/2013/04/29/3051392.html http://www.cnblogs.com/ziyi--caolu/archive/2013/08/01/3229668.html http://www.cfanz.cn/index.php?c=article&a=read&id=172173 #include <iostream> #include <string> #include

LightOJ 1422 Halloween Costumes (区间dp 好题)

1422 - Halloween Costumes PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB Gappu has a very busy weekend ahead of him. Because, nextweekend is Halloween, and he is planning to attend as many parties as he can.Since it's Hall

light oj 1422 - Halloween Costumes (区间dp)

1422 - Halloween Costumes PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB Gappu has a very busy weekend ahead of him. Because, next weekend is Halloween, and he is planning to attend as many parties as he can. Since it's Ha

LightOJ 1422 Halloween Costumes 区间dp

题意:给你n天需要穿的衣服的样式,每次可以套着穿衣服,脱掉的衣服就不能再穿了,问至少要带多少条衣服才能参加所有宴会 思路:dp[i][j]代表i-j天最少要带的衣服 从后向前dp 区间从大到小 更新dp[i][j]时有两种情况 考虑第i天穿的衣服 1:第i天穿的衣服在之后不再穿了 那么 dp[i][j]=dp[i+1][j]+1; 2:第i天穿的衣服与i+1到j的某一天共用,那么dp[i][j]=min(dp[i][j],dp[i+1][k-1],dp[k][j]),前提是第i天和第k天需要的礼

Light oj 1422 - Halloween Costumes

题目:http://lightoj.com/volume_showproblem.php?problem=1422 #include <cstdio> #include <iostream> using namespace std; int c[105]; int dp[105][105]; int main () { int T, N; scanf("%d", &T); for(int kase=1; kase<=T; kase++) { sca

【LightOJ 1422】Halloween Costumes(区间DP)

题 题意 告诉我们每天要穿第几号衣服,规定可以套好多衣服,所以每天可以套上一件新的该号衣服,也可以脱掉一直到该号衣服在最外面.求最少需要几件衣服. 分析 DP,dp[i][j]表示第i天到第j天不脱第i天之前的衣服最少需要的衣服数量,那就可以由和第j天穿一样的衣服的第k天转移过来,或者再套一件第j天的衣服. 状态转移方程:dp[i][j]=min(dp[i][k]+dp[k+1][j-1],dp[i][j-1]+1)(i≤k<j,a[j]==a[k]) 算的时候i从大到小算,因为算dp[i][j

Light OJ 1031 - Easy Game(区间dp)

题目链接:http://www.lightoj.com/volume_showproblem.php?problem=1031 题目大意:两个选手,轮流可以从数组的任意一端取值, 每次可以去任意个但仅限在一端, 他们的得分分别是取得所有值的和.现在求这两个选手得分差值的最大值. 解题思路:设dp[i][j]代表从i到j这个区间中,所能够得到的最大差值,只需要枚举其中i到j之间的一个数c,作为断电,那么最大值应该为max(sum[c]-sum[i-1]-dp[c+1][j], sum[j]-sum

Light OJ 1033 - Generating Palindromes(区间DP)

题目大意: 给你一个字符串,问最少增加几个字符使得这个字符串变为回文串. ======================================================================================= #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> #include&l

POJ 2955:Brackets 区间DP基础题

Brackets 题目链接: http://poj.org/problem?id=2955 题意: 给出一个只由'('.')'.'['.']'构成的字符串,字符间可以匹配,左边的 '(' 可以与右边的 ')' 匹配,左边的 '[' 可以与右边的 ']' 匹配 两种匹配不能交叉,可以包含,如 [(])只算2个匹配而[()]算四个匹配,求最大匹配数. 题解: 设dp[i][j]为区间 i 到 j (设len为区间长度,j=i+len)内可以得到的最大匹配数,则有两种情况: ① j 不与区间[i,j]