light oj Halloween Costumes
2015-04-27 10:36
232 查看
题目大意:
你要去参加一系列舞会,每个舞会都有某一种款式的衣服,一件衣服你可以套在另外一件衣服上面穿,但是脱掉以后就不能再用这件衣服了;解题思路:
很经典的一道区间dp题目。我们用dp[i][j]表示i------j这段时间内最少的穿衣件数;
因此我们需要不断的枚举可以分割区间的点来更新答案,而这个过程我们需要后面某一段时间的最优值,因此我们进行递推的时候需要自下而上的更新答案;
初始化:
dp[i][j]=dp[i+1][j]+1;假设第i天穿的衣服与后面的都不一样,最坏情况下即+1;
转移:
考虑第i天,如果num[i]==num[k] i<k<=j; dp[i][j]=min(dp[i][j],dp[i+1][k-1]+dp[k][j]);
如何理解上面的方程?
因为我们答案是自下而上的更新,所以是逆推的,所以我们是从舞会的最后一天开始往前考虑,因为第k天与第i天穿的衣服一样,因此我们可以第i天不穿新的衣服,用k的衣服就行啦,而且第k天的衣服可能是更后的因此我们需要dp【k】【j】的最优值,又因为第i天可以不穿衣服,所以我们再加上i+1---k-1这段时间的最优值即可;
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int main() { int n; int tt=1; int t; scanf("%d",&t); while(t--) { scanf("%d",&n); int num[110]; int dp[110][110]; for(int i=1;i<=n;i++) scanf("%d",&num[i]); for(int i=1;i<=n;i++) for(int j=i;j<=n;j++) dp[i][j]=j-i+1; for(int i=n-1;i>=1;i--) for(int j=i+1;j<=n;j++) { dp[i][j]=dp[i+1][j]+1; for(int k=i+1;k<=j;k++) if(num[i]==num[k]) dp[i][j]=min(dp[i][j],dp[i+1][k-1]+dp[k][j]); } printf("Case %d: %d\n",tt++,dp[1] ); } }
相关文章推荐
- 区间dp||记忆化搜索 Game of Sum UVA - 10891 or Light OJ 1031---Easy Game(区间DP)
- Light oj 1422 Halloween Costumes 区间DP
- light--oj--1294-- Positive Negative Sign(数学规律)
- lightoj 1422 - Halloween Costumes 【区间dp入门】
- [区间DP 22 Halloween Costumes LightOJ - 1422 ]
- 动态规划训练7 [Halloween Costumes ]
- Aladdin and the Flying Carpet Light OJ 1341
- 【Light-oj】-1138-Trailing Zeroes (III)(找到一个数使其阶乘后0的个数为n)
- Light-oj 1282 - Leading and Trailing
- uestc oj Justice is Given by Light(计算几何)
- LightOj 1422 Halloween Costumes 两种姿势详解(区间DP)
- light_oj 1282
- 【Light-oj】-1282 - Leading and Trailing(数论,快速幂,log,好)
- 【Light-OJ】-1410- Consistent Verdicts(思维)
- Light OJ Substring Frequency (II)
- Light-oj-1094 Farthest Nodes in a Tree (树的直径模板题)
- 【Light-oj】-1138 - Trailing Zeroes (III)(二分,数学)
- 【light-oj】-1305 - Area of a Parallelogram(水)
- Light oj1422 Halloween Costumes 区间DP
- Light oj Trailing Zeroes (III) (二分查找)