总结
这个题感觉不太好想,每次结果取前两个子区间,B子区间全脱光,所以初始化为0,当时初始化为Inf,一直错,可能出现k+1>j-1情况的,这种是B子区间不存在的情况,为0即可,相当于脱光。算是混过一个区间DP了。
题意:
一个人要去参加n个party,第i场party需要穿a[i]风格的衣服,他为了方便可以衣服外面套衣服,在参加party时可以脱掉外面的衣服露出里面的衣服而适应当场party的风格,脱掉的衣服不能再用,问最少需要穿多少次衣服。
题目链接
//#pragma GCC optimize(2)
#include<bits/stdc++.h>
//typedef long long ll;
//#define ull unsigned long long
//#define int long long
#define F first
#define S second
#define endl "\n"//<<flush
#define eps 1e-6
#define lowbit(x) (x&(-x))
#define PI acos(-1.0)
#define inf 0x3f3f3f3f
#define MAXN 0x7fffffff
#define INF 0x3f3f3f3f3f3f3f3f
#define pa pair<int,int>
#define ferma(a,b) pow(a,b-2)
#define pb push_back
#define all(x) x.begin(),x.end()
#define memset(a,b) memset(a,b,sizeof(a));
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
using namespace std;
void file()
{
#ifdef ONLINE_JUDGE
#else
freopen("cin.txt","r",stdin);
// freopen("cout.txt","w",stdout);
#endif
}
const int N=1e2+5;
int dp[N][N];
signed main()
{
// IOS;
//file();
int t;
scanf("%d",&t);
for(int q=1;q<=t;++q)
{
int n;
scanf("%d",&n);
vector<int>a(n+1);
memset(dp,0);
for(int i=1;i<=n;++i)
dp[i][i]=1,scanf("%d",&a[i]);
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;++k)
if(a[k]==a[j])
dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j-1]);
}
}
printf("Case %d: %d\n",q,dp[1][n]);
}
return 0;
}