LightOJ 1422 Halloween Costumes 【 区间dp 】

区间dp的第一题-----

看题解看了好多~~终于看懂了---55555

dp[i][j] 表示第i天到第j天至少需要多少件衣服

那么第i件衣服只被第i天占用的话, dp[i][j] = dp[i+1][j] + 1

如果不只被第i天占用的话,那么假设在第k天和第i天穿一样的衣服,dp[i][j] = dp[i+1][k-1] + dp[k][j]

这一篇讲得很详细~

http://blog.csdn.net/tc_to_top/article/details/44830317

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 #include<cmath>
 6 using namespace std;
 7 
 8 int dp[505][505];
 9 int a[505];
10 int n;
11 
12 int main(){
13     int T;
14     int kase = 0;
15     scanf("%d",&T);
16     while(T--){
17         scanf("%d",&n);
18         for(int i = 1;i <= n;i++) scanf("%d",&a[i]);
19         
20         for(int i = 1;i <= n;i++)
21          for(int j = i;j <= n;j++) dp[i][j] = 1;
22          
23          for(int i = n-1;i >= 1;i--){
24              for(int j = i;j <= n;j++){
25                  dp[i][j] = dp[i+1][j] + 1;
26                  for(int k = i+1;k <= j;k++){
27                      if(a[k] == a[i]) dp[i][j] = min(dp[i][j],dp[i+1][k-1] + dp[k][j]);
28                  //    printf("dp[%d][%d] = %d
",i,j,dp[i][j]);
29                  }
30              }
31          }
32          printf("Case %d: %d
",++kase,dp[1][n]);
33     }
34     return 0;
35 }
View Code

用记忆化搜索写半天都木有写出来啊啊啊啊~~~

初始化还是不懂写啊~~~

该滚了~~~