LightOJ 1422 Halloween Costumes

https://vjudge.net/problem/LightOJ-1422

题意:

给你n天需要穿的衣服的样式,每次可以套着穿衣服,脱掉的衣服就不能再穿了,问至少要带多少条衣服才能参加所有宴会。

 

思路:

很明显的区间DP问题。既然是区间DP,那么我们就要选定范围来进行分析。d[i][j]表示的是i~j之间所要穿的衣服的最少衣服数。

状态转移方程就是d[i][j] = min(d[i][j], d[i][k - 1] + d[k+1][j])。k代表的是在i~j这个区间内第k天要穿的衣服和第i天的衣服是一样。d[i][k - 1] + d[k+1][j]的意思就是第i天这件衣服穿了之后就不再脱下来。

 1 #include<iostream> 
 2 #include<string>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 int n;
 8 int a[105];
 9 int d[105][105];
10 
11 int main()
12 {
13     //freopen("D:\\txt.txt", "r", stdin);
14     int kase = 0;
15     int T;
16     cin >> T;
17     while (T--)
18     {
19         cin >> n;
20         for (int i = 1; i <= n; i++)
21             cin >> a[i];
22         for (int i = 1; i <= n; i++)
23         {
24             for (int j = i; j <= n; j++)
25             {
26                 d[i][j] = j - i + 1;
27             }
28         }
29         for (int i = n; i >= 1;i--)
30         for (int j = i + 1; j <= n; j++)
31         {
32             d[i][j] = d[i + 1][j] + 1;
33             for (int k = i + 1; k <= j; k++)
34             {
35                 if (a[i] == a[k])
36                     d[i][j] = min(d[i][j], d[i][k - 1] + d[k+1][j]);
37             }
38         }
39         cout << "Case " << ++kase << ": " << d[1][n] << endl;
40     }
41     return 0;
42 }

 

posted @ 2017-02-09 15:37  Kayden_Cheung  阅读(164)  评论(0编辑  收藏  举报
//目录