题解
- dp[i][j]表示第i天到第j天穿的最少的衣服。初始化dp[i][i] = 1(一天必须穿一件),dp[i][j] = inf。
- 如果第i天和第j天穿的是一件衣服,那么dp[i][j] = dp[i][j-1]。
- 剩下的就是区间DP模板。
代码
#include <bits/stdc++.h>
using namespace std;
int const N = 100 + 10;
int const inf = 0x7f7f7f7f;
int a[N],n;
int dp[N][N];
int main(){
int T,caser = 0;
scanf("%d",&T);
while(T--){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=n;i>=1;i--){ //从后往前
dp[i][i] = 1;;
for(int j=i+1;j<=n;j++){
dp[i][j] = inf;
if(a[i] == a[j]) dp[i][j] = dp[i][j-1]; //第i天和第j天穿的衣服相同
for(int k=i;k<j;k++)
dp[i][j] = min(dp[i][j],dp[i][k] + dp[k+1][j]);
}
}
printf("Case %d: %d\n",++caser,dp[1][n]);
}
return 0;
}