题目链接:http://lightoj.com/volume_showproblem.php?problem=1422
区间DP的思路:
对于区间(i,j)如果第i件衣服和区间内的其他从i+1到j的衣服都不同,即第i件衣服在这个区间我们只穿一次,那么dp[i][j]=dp[i+1][j]+1;
否则遍历k(i<k<=j),如果a[k]==a[i],那么对于第k个party,可以穿第i件衣服,此时dp[i][j]=min(dp[i][j],dp[i+1][j-1]+dp[k][j]);
然后注意初始化即可
自己感觉自己对区间dp的初始化还是总把握不好。。。
代码如下:
1 #include<iostream> 2 #include<cstdlib> 3 #include<cstdio> 4 #include<cstring> 5 #include<cmath> 6 using namespace std; 7 #define MAX 110 8 int dp[MAX][MAX]; 9 int n; 10 int a[MAX]; 11 int main() 12 { 13 int t; 14 scanf("%d",&t); 15 int tol=1; 16 while(t--) 17 { 18 scanf("%d",&n); 19 for(int i=0;i<n;i++) 20 scanf("%d",&a[i]); 21 memset(dp,0,sizeof(dp)); 22 for(int i=0;i<n;i++) 23 for(int j=i;j<n;j++) 24 dp[i][j]=j-i+1; 25 for(int j=0;j<n;j++) 26 for(int i=j-1;i>=0;i--) 27 { 28 dp[i][j]=dp[i+1][j]+1; 29 for(int k=i;k<=j;k++) 30 { 31 if(a[i]==a[k]) dp[i][j]=min(dp[i+1][k-1]+dp[k][j],dp[i][j]); 32 } 33 } 34 cout<<"Case "<<tol++<<": "<<dp[0][n-1]<<endl; 35 36 } 37 return 0; 38 }