dp
qcccc_
这个作者很懒,什么都没留下…
展开
-
H. The Boomsday Project
题意:租共享单车,每次r元,可以买卡,卡的有效期为d天,可用次数为k次,费用为c元,每次买新卡会覆盖旧卡,现有n种买卡的方案,m天需要骑车,其中这m天,第pi天需要骑车qi次。问最小费用。题解:关于第i天可能使用的骑车方案不是同一种,所以,干脆不要看每一天用哪一种方案了,而是每一次骑车用哪种方案。#include <algorithm>#include <deque>#include <iomanip>#include <iostream>#inc原创 2021-11-08 21:51:10 · 224 阅读 · 0 评论 -
Codeforces Round #734 (Div. 3)
E. Fixed Points题目链接看完题解挺简单的一道dp题目题意:给你一个数组,每次可以删除一个数,让你求出删数的个数最少的次数,使得a[i]==i的个数大于等于k。题解:设dp[i][j]为前i个数保留j个数,然后如果第i数保留的话那么就得a[i]==j才能使得dp[i][j]更新(dp[i][j]=max(dp[i-1][j-1]+1,dp[i][j]),如果第i个数不保留的话,那么就是dp[i][j]=max(dp[i][j],max(dp[i-1][j-1],dp[i-1][j])原创 2021-07-25 10:46:54 · 94 阅读 · 0 评论 -
AcWing 276. I-区域
题目超链接题意中文题目没啥好说的首先得知道这是一个dp题,然后再求解,至于怎么知道,还是写题少,菜鸟的悲伤,呜呜呜。知道是dp后,接下来就是分析了,对于左边分析,肯定是先扩张,然后可能会缩减,而且一旦缩减就不会在扩张了,这样是吧为了保证图形是凸型,对于右边也是一样的,然后就是看怎么保证是扩张还是缩减了,那么就要知道前一行的某个状态的l到r的状态,然后在本状态再根据是扩张还是缩减来定义本状态的l和r的值。所以就有下面几个需要维护的:到第几行了,有多少个格子了,本状态的l,本状态的r,左边的扩张还是原创 2021-07-16 23:13:43 · 95 阅读 · 0 评论 -
P2782 友好城市
P2782 友好城市1本题隐晦的说这个题目是一个最长上升子序列,先对南边或者北边排个序,然后再求最长上升子序列,我也不知道自己怎么想出来的,可能就是我最近一直在写dp有关的题目吧#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#include<string>#include<vector>#include<queue>原创 2020-09-29 20:18:09 · 81 阅读 · 0 评论 -
P1107 [BJWC2008]雷涛的小猫
P1107 [BJWC2008]雷涛的小猫这可能是我最近没看题解自己写的第一个简单dp问题吧这个题目我也不知道我当时怎么想的,看着看着就有了方向,一开始我是这样想的dp[i][j]表示到达第i颗树高度为j时的最优解,那么转移方程就是dp[i][j]=max(dp[i][j+1],dp[k][j+delate])+a[i][j](a[i][j]表示第i颗树高度为j有多少柿子),然后我就想是不是用单调队列优化,结果写不出来,又仔细的想了一下dp[i][j]我只要找到他高度为j+delate时的最大值就好了,原创 2020-09-29 17:23:56 · 141 阅读 · 0 评论 -
P1439 【模板】最长公共子序列
P1439 【模板】最长公共子序列这个题目我是没想到反正我感觉十分的神奇先写一下我在洛谷题解区看见的一个很好理解的题解对于样例 3 2 1 4 51 2 3 4 5我们可以把第一个数组编号位a b c d e。。那么第二个数组就变成了c b a d e现在对于第二个数组的最长上升子序列就是答案,因为首先每个数只出现一次,其次相对于abcde来说其就是一直上升的,所以对于第二个数组来说其上升的序列必然是第一个的子序列,所以说答案就是最长上升子序列。代码如下#include<iostr原创 2020-09-27 20:18:01 · 177 阅读 · 0 评论 -
D - Denouncing Mafia Gym - 102346D(树形dp)
我还是不会写树形dp之类的题目,这个题还是不是自己写出来的看了题解,不过好在看了题解一下就会写了,也算是一种小小的提升吧。这道题求k条路经最多可以覆盖多少个点,这个的话最长的那条边肯定是要选的,选了最长的那条边之后,这个数就变成了一个森林了,那么现在就是再到这个森林里找最长的那条边,这种找法很容易就想到了优先队列维护,所以这个题的关键还是树形dp我们可以在dfs中也加上一个优先队列,每一次找到他的从儿子节点回溯回来之后加入优先队列,儿子全部遍历完之后,再把最长的那条链赋值给这个点,剩余的优先队列里的值减.原创 2020-08-13 20:11:00 · 161 阅读 · 0 评论 -
P4017 最大食物链计数(简单的树形dp)
P4017 最大食物链计数由于数据不存在环,所以一定能找到食物链的起点,那么就可以由食物链的起点记忆化搜索直到终点然后返回1,说明有一条食物链,然后就没了,具体看代码理解吧#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#include<string>#include<vector>#include<queue>#原创 2020-08-12 20:01:22 · 301 阅读 · 0 评论 -
背包dp加路径搜索
P1759 通天之潜水首先不难看出这是一道背包dp加路径搜索,只是不知道怎么求而已,背包dp比较好求,和以前做的背包dp差不多,只是由一个限制条件变成了两个而已,那么我们就可以直接三重for求解,路径搜索的话,我从大佬那里学到了一种新的求解方法,用string 记录路径,这也太强了,这个直接看代码吧#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#incl原创 2020-08-12 17:30:41 · 158 阅读 · 0 评论 -
Food Delivery ZOJ - 3469(区间dp)
害,一道简单简单题居然搞了我一下午,我还是改不了不喜欢动笔的毛病,天天就想着能看出答案,我太难了,这个毛病一定要改,一直看着题目思维贼混乱,一混乱就不想写题目。这题的题意也很有意思v是代表的是走1m所需要的时间现在来解释一下这个区间dp的题,首先你得对坐标从小到大排个序吧?排序的时候得把餐厅加进去,套路,然后很容易想到的是dp[i][j]从i到j,但是转移的时候又不好转移了,因为dp[i][j]你不知道是从i+1转移来的,还是从j-1转移来的,所有就要考虑加一维数组了,dp[i][j][0/1],dp.原创 2020-08-10 20:38:05 · 127 阅读 · 0 评论 -
疯狂刷dp中
数字游戏这是一个很好的区间dp题,个人感觉,容易想到,但是不容易写出来,边界处理很强,预处理出,前缀和,最小值需要初始化,破坏环成为两倍的大小的数组,细节很多。#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#include<string>#include<vector>#include<queue>#include&原创 2020-08-07 09:48:58 · 159 阅读 · 0 评论 -
购物
题目戳我每天至少要吃一颗糖,一天买k个糖的花费为糖的钱加上k*k,可储存,问最少需要多少钱.首先要想到是dp,我也没想到,惭愧啊,然后就是dp的注意事项了,一共有n天那么最少花费一定是n天吃了n个糖。由这两个状态可以得到dp方程的形式为这样dp[i][j]到第i天一共买了j个糖(i<=j)因为每天要吃一个;#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>原创 2020-08-05 14:47:16 · 145 阅读 · 0 评论 -
P2426 删数
题目链接好久没有来水博客了,来水一道区间dp吧。这道题应该不难看出是区间dp,而且很简单,所以我就拿来水一篇博客.#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#include<string>#include<vector>#include<queue>#include<algorithm>#inc原创 2020-08-02 11:34:08 · 195 阅读 · 0 评论 -
P1537 弹珠(多重背包问题)
很简单的一个题,只是我最近很少自己写出来过题。自己写出了个dp题很爽,所以写篇博客。就贴个代码算了,明天还有大事#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#include<string>#include<vector>#include<queue>#include<algorithm>#incl.原创 2020-07-30 20:38:57 · 219 阅读 · 0 评论 -
P1412 经营与开发(多重背包二进制写法,单调队列待补)
题目戳我为什么可以用二进制写这种题呢?因为二进制可以表示任何一个数。先给一个二级制拆分的模板 for(int i=1;i<=n;i++) { for(int j=1;j<=a[i].m;j<<=1)//j表示这次拆分的个数 { a[i].m-=j;//减去拆了的数量 b[++tot].v=j*a[i].v;//重新分配后新物品的价值 b[tot].w=j*a[i原创 2020-07-29 11:29:21 · 125 阅读 · 0 评论 -
P1523 旅行商简化版
题目戳我中文题且好理解,但是不好做,烦!!!看了题解才知道,从西走到东和从东走到西可以看成从西往两个方向走到西,当我们走到一个点要去另外一个点的时候很自然的想到了dp,因为从这个点走到另外一个点无非是从两条路中选一条走,dp[i][j]代表第一条路走到了i,第二条路走到了j,规定j>i,那么就可以得到转移方程: dp[i][j+1]=min(dp[i][j+1],dp[i][j]+dis(j,j+1));//从最长的那条路走到j+1 dp[j][j+1]=min(dp[j][j+1],dp原创 2020-07-29 10:03:30 · 105 阅读 · 0 评论 -
Milking Time POJ - 3616
Bessie is such a hard-working cow. In fact, she is so focused on maximizing her productivity that she decides to schedule her next N (1 ≤ N ≤ 1,000,000) hours (conveniently labeled 0..N-1) so that she produces as much milk as possible.Farmer John has a l原创 2020-07-28 14:08:10 · 2165 阅读 · 0 评论 -
FatMouse and Cheese HDU - 1078
题目戳我本题的意思是一只老鼠再一个n*n的图上找东西吃每次只能走k个单位距离,每次获得的奶酪要比上一次多,求不能走时最大奶酪数量。本来想像以前的dp一样的写的,但是感觉好难写啊,然后就想用记忆化搜索,问题又来了我还是太菜了,调了半天还是没调出来,总是想到算法写不出来好难受啊。#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#include<stri原创 2020-07-28 12:27:35 · 104 阅读 · 0 评论 -
HDU - 5532 A - Almost Sorted Array(单调队列优化最长上升子序列)
题目戳我害,这个题目想到是最长上升子序列但是不会写,因为我唯一会的dp还被卡了,我太难了,果然学算法还是得多学点,不然凉凉啊,n^2的算法太难了。题解:用贪心加二分优化dp,结果时间复杂度是O(nlogn)优化详解强烈推荐#include<iostream>#include<stdio.h>#include<math.h>#include<string.h>#include<string>#include<vector&原创 2020-07-15 19:27:57 · 265 阅读 · 0 评论