题目链接:https://vjudge.net/problem/LightOJ-1422
题意:给出n个聚会,每个聚会对应一套服装,每次聚会后可以在原来衣服上套上新衣服,也可以脱去衣服,每套服装在脱下后不能够再继续穿。脱衣顺序是从后穿的先脱。
解题思路:
dp[i][j]为从第i个晚会到第j个晚会需要的衣服数量
利用区间DP
转移方程为
if(s[j]==s[k])
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j-1])
表示将k+1到j-1之间的衣服全部脱去
#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
int t;
int n;
int a[200];
int dp[200][200];
int main(){
int m=0;
cin>>t;
while(t--){
m++;
memset(dp,0,sizeof(dp));
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
dp[i][i]=1;
for(int j=1;j<i;j++){
dp[j][i]=dp[j][i-1]+1; //直接穿上一件新衣服
//讨论不需要穿新衣服的情况
for(int k=j;k<i;k++){
if(a[i]==a[k])
dp[j][i]=min(dp[j][i],dp[j][k]+dp[k+1][i-1]);
}
}
}
cout<<"Case "<<m<<": "<<dp[1][n]<<endl;
}
return 0;
}