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 }