题意: 给你n天分别要穿的衣服种类,可以套着穿, 一旦脱下来就不能再穿,求n天至少要几件. 思路: 区间DP dp[i][j]代表i到j需要至少几件衣服 第i天的衣服在第i天穿上了,dp[i][j]=dp[i+1][j]+1, 枚举区间(i,j],如果有第k天的衣服=第i天的,考虑第i件衣服在在第i天没穿(因为穿上了,第k天还需要穿么?)dp[i][j]=dp[i+1,k-1]+dp[k,j]: #include <bits/stdc++.h> using namespace std; typ…
B - Halloween Costumes Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu Submit Status Practice LightOJ 1422 Description Gappu has a very busy weekend ahead of him. Because, next weekend is Halloween, and he is planning to attend as…
Description Gappu has a very busy weekend ahead of him. Because, next weekend is Halloween, and he is planning to attend as many parties as he can. Since it's Halloween, these parties are all costume parties, Gappu always selects his costumes in such…
区间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 #include…
1:给出一个括号字符串,问这个字符串中符合规则的最长子串的长度. [分析]区间DP要覆盖整个区间,那么要求所有情况的并集. 先想出状态方程: dp[i][j]:i ~ j区间内最大匹配数目 输出:dp[][n-](从0开始) 区间DP最先想到的是就是: .边界情况初始化 .for枚举区间长度,一般从第二个开始 .for枚举起点 .直接求得终点 .若括号匹配的情况,相当于外围是ok的,继续深入看内部,左端点右移&右端点左移+(因为外围匹配,数目+) .一般情况就是枚举断点k,打擂台求匹配数目最大值…
题意:就是求石子归并. 题解:当范围在100左右是可以之间简单的区间dp,如果范围在1000左右就要考虑用平行四边形优化. 就是多加一个p[i][j]表示在i到j内的取最优解的位置k,注意能使用平行四边形优化的条件: 1.证明w满足四边形不等式,这里w是m的附属量,形如m[i,j]=opt{m[i,k]+m[k,j]+w[i,j]},此时大多要先证明w满足条件才能进一步证明m满足条件 2.证明m满足四边形不等式 3.证明s[i,j-1]≤s[i,j]≤s[i+1,j] .如果在10000左右时就…
题意: 有个人要去参加万圣节趴,但是每到一个趴都要换上特定的服装,给定一个序列表示此人要穿的衣服编号(有先后顺序的),他可以套很多件衣服在身上,但此人不喜欢再穿那些脱下的衣服(即脱下后就必须换新的),问最少需要穿多少件衣服? 思路: 如果多件一样的相连的话就可以只穿1件.将问题化为小问题,再来连接起来,假设区间[i->j],如果color[i]和后面其中某一个颜色(假设下标为k)一样,那么color[i]=color[k].那么第i件就可能可以不穿,当且仅当 dp[i+1][k-1]+dp[k]…
题 题意 告诉我们每天要穿第几号衣服,规定可以套好多衣服,所以每天可以套上一件新的该号衣服,也可以脱掉一直到该号衣服在最外面.求最少需要几件衣服. 分析 DP,dp[i][j]表示第i天到第j天不脱第i天之前的衣服最少需要的衣服数量,那就可以由和第j天穿一样的衣服的第k天转移过来,或者再套一件第j天的衣服. 状态转移方程:dp[i][j]=min(dp[i][k]+dp[k+1][j-1],dp[i][j-1]+1)(i≤k<j,a[j]==a[k]) 算的时候i从大到小算,因为算dp[i][j…
传送门 这道题第一眼看上去可能让人以为是贪心……不过贪心并不行,因为每次的操作是有2的幂次方的权值的.这样的话直接每次贪心最小的就目光短浅.所以那我们自然想到了DP. 据说这是一道很正常的区间DP? 区间DP的基本思想,就是先处理出小区间的最优解,再由多个小区间合并成一个大区间. 不过这道题的想法略微有些不同.首先从题目描述上来看,每行的取数是独立的,对于每一行我们来分析一下. 首先,因为题目中说只能取一行元素当前的首个元素或者末尾元素.既然如此,我们假设dp[i][j]表示选取区间i-j所能获…
这段时间学习了区间DP,所以试着把学到的东西稍作总结,以备不时之需. 学习区间DP首先要弄清区间DP是为了解决什么问题:一般的DP主要是特征是一次往往只操作一个数值或者存储可以不连续的物品的状态(比如背包问题中,每一个点存储的状态中,拿到的物品的编号并不要求一定连续)而区间DP,则是要求DP数组中每个点的状态映射到原本的数据集中都会与附近的元素有所关联,其中,连续区间的长度.起始点的位置.子区间分割点的位置都会有所变化,而这和一般的DP有所不同,故一般用区间DP. 区间DP的一般格式(参考博客)…