题意:要参加n天的party,每天指定要穿什么衣服,衣服叠加穿但是一但脱下来就不能再穿上去
问最少需要准备几件衣服。
首先要知道当a[i]==a[j]时即第i天与第j天要穿的衣服一样时,第j天最少要穿的衣服数是第j-1天所要穿的衣服数
只要把前面穿的别的衣服脱下来就行了。当然也可以考虑继续穿上一件这样的衣服,显然这样在i~j天内就不是最
优解。我们可以用区间来解决这个问题,就如上面说的,在i~j区间就这样考虑然后再推广到1~n的区间,这样就
是标准的区间dp了
#include <iostream>
#include <cstring>
using namespace std;
int a[110];
int dp[110][110];
int main() {
int t;
cin >> t;
int ans = 0;
while(t--) {
ans++;
int n;
cin >> n;
for(int i = 1 ; i <= n ; i++)
cin >> a[i];
memset(dp , 0X3f3f3f3f , sizeof(dp));
for(int i = 1 ; i <= n ; i++) {
for(int j = i ; j <= n ; j++) {
dp[i][j] = j - i + 1;
}
}
for(int i = 1 ; i < n ; i++) {
for(int j = 1 ; j <= n && i + j <= n ; j++) {
if(a[j] == a[i + j]) {
dp[j][i + j] = min(dp[j][i + j] , dp[j][i + j - 1]);
}
for(int k = j ; k < i + j ; k++) {
dp[j][i + j] = min(dp[j][i + j] , dp[j][k] + dp[k + 1][i + j]);
}
}
}
cout << "Case " << ans << ": ";
cout << dp[1][n] << endl;
}
return 0;
}