LightOJ - 1422.Halloween Costumes(区间dp)

题目链接: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;
}

猜你喜欢

转载自blog.csdn.net/littlegoldgold/article/details/107338165