链接:lightoj1422
题解
- DP[i][j]表示区间i~j所需的最少服装
- 1: 如果i这件衣服后面无法重复使用DP[i][j]=DP[i+1][j]+1
- 2: 如果i+1~j内有一个k与i一样,可以考虑在k这个位置重复利用i这件衣服即DP[i][j]=min(DP[i][j],DP[i][k-1]+DP[k+1][j])
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
using namespace std;
const int N=107;
int dp[N][N],c[N],n,T;
int main(){
scanf("%d",&T);
rep(cnt,1,T){
scanf("%d",&n);
rep(i,1,n)scanf("%d",&c[i]);
rep(i,1,n)dp[i][i]=1;
rep(l,2,n)rep(i,1,n-l+1){
int j=i+l-1;
dp[i][j]=dp[i+1][j]+1;
rep(k,i+1,j)if(c[k]==c[i])dp[i][j]=min(dp[i][j],dp[i][k-1]+dp[k+1][j]);
}
printf("Case %d: %d\n",cnt,dp[1][n]);
}
return 0;
}