1.初始化为最坏情况,即区间多长,就用多少件衣服。
2.i是用来枚举起始位置,j枚举终点位置,k代表分割区间的位置。
3.如果从第计算dp[i][j]时,如果第i+1~j中没有一件衣服和第i天一样,
dp[i][j] = dp[i+1][j]+1;
如果有a[i] == a[k]
dp[i][j] = min(dp[i][j],dp[i+1][k-1]+dp[k][j])
代表第i次派对的衣服一直穿到第k次
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int inf = 205;
int main()
{
int T,a[205],n,dp[205][205];
scanf("%d",&T);
for(int l = 1 ; l <= T ; l++)
{
scanf("%d",&n);
for(int i = 1 ; i <= n ; i++)
scanf("%d",&a[i]);
for(int i = 1 ; i <= n ; i++)
for(int j = i ; j <= n ; j++)
{
dp[i][j] = j-i+1;
}
for(int i = n-1 ; 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(a[i] == a[k])
{
dp[i][j] = min(dp[i][j],dp[i+1][k-1]+dp[k][j]);
}
}
}
}
printf("Case %d: %d\n",l,dp[1][n]);
}
return 0;
}