链接:点击打开链接
题意:给你n天要穿的衣服的种类,可以套着别的种类的衣服穿,但一旦脱下就不会再穿,问n天要准备几件衣服
代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
int s[105],dp[105][105];
int main(){ //区间dp
int t,m,i,j,k,l,n,cas;
cas=1;
scanf("%d",&t);
while(t--){
scanf("%d",&n);
for(i=1;i<=n;i++)
for(j=1;j<=n;j++)
dp[i][j]=(i==j); //dp[i][j]代表从i到j需要几件服装
for(i=1;i<=n;i++) //每个区间有两种可能,一种是不再
scanf("%d",&s[i]); //传上一场的衣服,另一种是将上一
for(l=2;l<=n;l++) //场的衣服保留下来
for(i=1;i+l-1<=n;i++){
dp[i][i+l-1]=dp[i][i+l-2]+1; //不需要上一场衣服则dp[i][j]=dp[i][j-1]+1;
for(k=i;k<i+l-1;k++)
if(s[k]==s[i+l-1]) //如果将第k场的衣服保留到第j场则
dp[i][i+l-1]=min(dp[i][i+l-1],dp[i][k]+dp[k+1][i+l-2]);
} //dp[i][j]=dp[i][k]+dp[k+1]j-1
printf("Case %d: %d\n",cas++,dp[1][n]);
}
return 0;
}