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;
}

转载于:https://www.cnblogs.com/kiuhghcsc/p/5746030.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值