DP
学习后的夜晚
难事必有所得,成为杜崎拓
展开
-
HDU1074(状压DP入门题)
这道题关于字典序为什么要逆序,还有如何记录状态路径做了示范,是一道非常有启发的题目。原创 2022-11-24 20:47:30 · 164 阅读 · 0 评论 -
HDU1069
DP[i]表示以i为最高点箱子的最大值。原创 2022-11-24 17:48:20 · 125 阅读 · 0 评论 -
HDU1024
思想:这道题要用到第二个dp数组,dpb表示m-1轮,前j个中最大的dp值,还有在更新dpb的时候,我的数组有2种方式,错误的那一种是可能用到了未知值,DP的时候一定要避免未知值的发生。原创 2022-11-24 16:33:52 · 114 阅读 · 0 评论 -
蓝桥杯-装饰珠
一个抽象的分组背包问题,然后最后的解是要遍历所有DP数组,而不是只有最后一个,因为背包在遍历的过程中扩大了!具体为什么我也不清楚。原创 2022-11-09 16:55:41 · 342 阅读 · 0 评论 -
You Are the One HDU - 4283
这道题真的是给人启迪的一道题。这道题的dp状态设计为dp[i][j]表示一个区间的最优值接着,我们便要思考状态转移方程,对于区间dp的传统来说要遍历断点,我以前从未思考过为什么要遍历端点,今天这道题就给了人非常好的启发。首先我想的是随便找一个k,然后把前后区间加起来再加上后面区间没有加上的屌丝值。当测试数据时,发现答案不对,这个时候便思考为什么?于是,发现如果一个大状态由几个小状态合作产生,那么一定要证明这个大状态一定是最优的。拿这道题举例,如果这个产生大状态,当合并时,可能会造成每个小区间的策略发生了变化原创 2022-06-11 23:20:33 · 108 阅读 · 0 评论 -
Food Delivery ZOJ - 3469
思想:做DP的题一定要多观察,遇到瓶颈一定要多观察和理解。要十分注意DP的值到底是个什么意思,小状态与大状态之间到底有什么联系,把所有可能的联系都要想到。且小状态到大状态的转移一定是一个合法的过程。合法的含义要具体问题具体分析。首先观察到,不论起点在哪,外卖员最后一站一定是在坐标轴的左右2端且决策的过程一定是一个左右左右来回摆动的过程。无论哪一个小区间,都一定会停留在左右2端。想错的时候总是误以为可能会有停留在中间这样的结果,但仔细思考发现并没有。dp定义为dp[i][j][d],d表示最后一个点是区间的左原创 2022-06-08 15:36:34 · 70 阅读 · 0 评论 -
Coloring Brackets CodeForces - 149D
思想:dp的定义为dp[l][r][lc][rc],表示此区间一定为正确的括号匹配,从l到r区间,l位置上色为lc,r位置上色为rc的上色总方案数。这道题与传统的区间DP不同,传统的区间DP枚举的是区间的长度,找断点。而对于这道题来说,需要找的是符合一个正确括号匹配的小区间来得到大区间的值,要排除不符合要求的小区间情况。通过观察得知,区间的合并不可能是相交的,只可能是包含与并列的关系。这个博客的图画的非常好:Codeforces149 D. Coloring Brackets(区间dp,合法括号序列性质)_原创 2022-06-05 20:53:04 · 163 阅读 · 0 评论 -
Halloween Costumes LightOJ - 1422
对于状态转移方程,将情况考虑为第j天的衣服是否穿上,通过这样的条件分类,能够涵盖所有的情况,因为无论如何定义DP,一定会考虑j天的衣服穿与不穿这样的情况,我一开始瞬间的想法就是背包问题。如果穿上那么DP[i][j]=DP[i][j-1]+1很简单。但难点是不穿上第j天的衣服时该如何考虑?如果不穿第j天的衣服,那么j的前面一定有相同的衣服,这个时候就是要把那天的衣服穿在身上,然后到第j天的时候脱掉之后的衣服。这便是k的定义。DP[i][j]=DP[i][k]+DP[k+1][j-1]DP[i][k]表示第i天原创 2022-06-04 20:53:47 · 71 阅读 · 0 评论 -
Multiplication Puzzle POJ - 1651
定义K为一个区间内最后一个被拿出的数字原创 2022-06-04 19:07:45 · 63 阅读 · 0 评论 -
Brackets POJ - 2955
这道题是关于无后效性的理解。状态转移的时候一定要涉及所有的情况,其次某个几个状态推出一个新的状态的值时,不一定最好,这里一定不要快速否决了想法。只要不违背状态的转移只与值有关而不与路径有关。仔细想想,遍历断点并把2个区间加起来的确能够基本包含所有的情况并找到最优值,但的确还遗漏了一种情况吗,便是若区间2端点括号匹配,这样便找到了所有情况。.........原创 2022-06-04 19:06:01 · 104 阅读 · 0 评论 -
Cake ZOJ - 3537
思想:先用Graman算法判断栈里的数量和N是否一样,从这里可以看出当走到最后一个点时,终点和起点连起来一定是凸的不是凹的。然后要把一个多边形用到DP上去,这里的角度有2个,一个是从边的角度,一个是从顶点的角度,但是边的角度最后也要落实到角上,倒不如直接用角来定义状态更为简单。DP定义2个状态,代表从i这个顶点出发,一直走到j这个顶点时,多边形划分最优三角形的最小值。其子问题一定是最优的且满足无后效性。这个是一个很明显的区间DP,如何将每一个划分可能列举出来是最难的,通过观察:核心思想为凸多边形原创 2022-05-31 15:22:13 · 81 阅读 · 0 评论 -
石子归并 V2 51Nod - 1022
#include<iostream>#include<stdio.h>#include<cstring>#define INF 0x7fffffffusing namespace std;const int m=2100;int dp[m][m];///定义在区间(i,j)内的最优值int o[m][m];int stone[m];int sum[m];///定义前缀和,用来求,2个堆这一次的合并值int main(){ int n; .原创 2022-05-30 15:46:55 · 70 阅读 · 0 评论 -
石子归并 51Nod - 1021
#include<iostream>#include<stdio.h>#include<cstring>#define INF 0x3f3f3fusing namespace std;const int m=1001;int dp[m][m];///定义在区间(i,j)内的最优值int stone[m];int sum[m];///定义前缀和,用来求,2个堆这一次的合并值int main(){ memset(dp,INF,sizeof(dp.原创 2022-05-28 21:45:55 · 61 阅读 · 0 评论