[区间DP 22 Halloween Costumes LightOJ - 1422 ]
题目大意:一个人去参加N个舞会,每个舞会对着装都有要求,他可以身上同时穿多件衣服,也可以脱下,现在按顺序告诉你每个舞会的着装要求,问他最少需要穿几次衣服。
分析:dp[i][j]表示从i到j最少需要穿几次衣服
两个for枚举区间,对于区间[i,j],枚举k,if(num[i]==num[k])dp[i][j]=min(dp[i][j],dp[i+1][k-1]+dp[k][j]);
AC代码:
#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<string.h>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
#define MAX 9999999999
#define MIN -1
using namespace std;
int main()
{
int t;
while(~scanf("%d",&t))
{
int ca=0;
while(t--)
{
ca++;
int n,num[110];
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
int dp[110][110];
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
for(int j=i;j<=n;j++)
{
dp[i][j]=j-i+1;
}//初始化
for(int i=n;i>=1;i--)
{
for(int j=i+1;j<=n;j++)
{//枚举区间
dp[i][j]=dp[i+1][j]+1;
for(int k=i+1;k<=j;k++)
{
if(num[i]==num[k])
dp[i][j]=min(dp[i][j],dp[i+1][k-1]+dp[k][j]);
}
}
}
printf("Case %d: %d\n",ca,dp[1][n]);
}
}
return 0;
}