LightOJ 1422 Halloween Costumes

dp[i]][j]=min(dp[i+1][j]+1,dp[i+1][k-1]+dp[k][j])

表示第i天到j的最小数量。如果第i天的衣服只自己穿的话,不考虑后面的就是dp[i][j]=dp[i+1][j]+1.否则就是dp[i][j]=dp[i+1][k-1]+dp[k][j],其中第k天的衣服和第i天一样,这就是考虑第i天以后还有和它穿的衣服一样的情况

 1 //#pragma comment(linker, "/STACK:167772160")//手动扩栈~~~~hdu 用c++交
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<iostream>
 6 #include<queue>
 7 #include<stack>
 8 #include<cmath>
 9 #include<set>
10 #include<algorithm>
11 #include<vector>
12 // #include<malloc.h>
13 using namespace std;
14 #define clc(a,b) memset(a,b,sizeof(a))
15 #define LL long long
16 const int Inf = 0x3f3f3f3f;
17 const double eps = 1e-5;
18 const double pi = acos(-1);
19 // inline int r(){
20 //     int x=0,f=1;char ch=getchar();
21 //     while(ch>'9'||ch<'0'){if(ch=='-') f=-1;ch=getchar();}
22 //     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
23 //     return x*f;
24 // }
25 
26 int a[110];
27 int dp[110][110];
28 
29 int main(){
30     int t;
31     int cas=1;
32     scanf("%d",&t);
33     while(t--){
34        clc(dp,0);
35        int n;
36        scanf("%d",&n);
37        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
38        
39        for(int i=1;i<=n;i++)
40         for(int j=i;j<=n;j++){
41             dp[i][j]=i-j+1;
42         }
43         for(int i=n;i>=1;i--){
44             for(int j=i;j<=n;j++){
45                 dp[i][j]=dp[i+1][j]+1;
46                 for(int k=i;k<=j;k++){
47                     if(a[k]==a[i])
48                     dp[i][j]=min(dp[i][j],dp[i+1][k-1]+dp[k][j]);
49                 }
50             }
51         }
52         printf("Case %d: %d
",cas++,dp[1][n]);
53        } 
54     return 0;
55 }
View Code
原文地址:https://www.cnblogs.com/ITUPC/p/5471922.html