动态规划
左佥都御史
这个作者很懒,什么都没留下…
展开
-
P3758可乐
https://www.luogu.com.cn/problem/P3758两种思路:①考虑邻接矩阵的幂对于图的意义。矩阵乘法定义如下ai,j=ai,k∗ak,ja_{i,j}=a_{i,k}*a_{k,j}ai,j=ai,k∗ak,j。所以矩阵的2次幂 就相当于此矩阵在2秒后的移动状态。②分层图dp(这个我还不咋会),然后那个转移方程可以用矩阵乘法来加速运算,从而达到优化。那个矩阵...原创 2020-03-26 18:10:31 · 163 阅读 · 0 评论 -
nefuoj1109-状态压缩dp-游戏争霸赛
http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 给定m个人比赛,输了淘汰,赢了继续比,最后有一个人是冠军,给定一个数组,a[i][j]为 i战胜j的欢乐度,问你如何欢乐度最多。#include <iostream>#include <cstdio>#include <cstring>using namesp原创 2017-07-26 17:46:52 · 243 阅读 · 0 评论 -
hdu6143-多校8&三种方法-组合数|递推|容斥-Killer Names
http://acm.hdu.edu.cn/showproblem.php?pid=6143 这道题这么多写法qwq 真的好强悍 1 递推。当时也想来着,不过我想的是打表那种,但其实m和n不一样,结果也是不一样的。在有限的颜色下。 i为 当前段,j为使用过的颜色 满足递推方程dp[i][j]=dp[i-1][j]j+dp[i-1][j-1](n-j+1)… 后面计算另一个的时候,就反着求原创 2017-08-18 11:42:07 · 260 阅读 · 0 评论 -
poj1458-LCS&回溯-Common Subsequence
https://vjudge.net/problem/POJ-1458 求最长公共子序列。。这是一个经典问题了,也记得去年看了这个看了好久qwq, 子序列,不一定是相连的qwq。 我的理解是,公共串在两个串中 的最后出现位置是不同的, 总共两种状态,可以递推qwq#include <cstdio>#include <iostream>#include <cstring>#include原创 2017-08-12 22:01:09 · 211 阅读 · 0 评论 -
HDU5041-壮压DP-D - Contest
http://acm.hdu.edu.cn/showproblem.php?pid=5045 m个人n题,每个人做对的概率给定,一道题只能一个人做。他做的时候其他人休息,问你如何分配能使作对概率最大。 有一个限制条件,每时每刻做题的时候,每个人做题数差值不能大于2。 解决方法很巧妙,先让没做过题的人做,如果都做过,那么就清零。在来。。 递推的过程没什么说的,#include <iostrea原创 2017-07-07 19:50:30 · 247 阅读 · 0 评论 -
hdu6035-树形dp-2017多校(2)&难-Colorful Tree
http://acm.hdu.edu.cn/showproblem.php?pid=6035 参考的大佬的博客。 附赠链接 http://blog.csdn.net/Bahuia/article/details/76141574 我觉得这道题,真是难。。 首先,反着求比较容易,我们可以先算出全集,然后减去每条路径中不出现的颜色数。 而不出现某种颜色,可以用类似虚数的思想,构建好多个只有相原创 2017-07-28 18:43:05 · 217 阅读 · 0 评论 -
POJ1065-LIS&偏序集定理-Wooden Sticks
https://vjudge.net/problem/POJ-1065 给定你一些木材,每次进行加工的时候 x1,y1 x2,y2 如果满足 x1<=x2&&y1<=y2 ,那么就不用重开 否则就得重开,重开一次费一秒,问你最少的花费是多少。 根据 偏序集定理, 把 x升序排之后 求他的 y的最长严格递减子序列就行。。 http://blog.csdn.net/acdreamers原创 2017-08-14 16:25:34 · 185 阅读 · 0 评论 -
nefuoj1204-区间dp&前缀处理-分段乘积最大
http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1204 中文题意。 先处理前缀和,然后枚举区间dp#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>using names原创 2017-08-14 20:53:46 · 294 阅读 · 0 评论 -
hdu1520-树形dp-Anniversary party
http://acm.hdu.edu.cn/showproblem.php?pid=1520 挺经典的,转移状态的时候想简单了。。 就改了一行就对了。。 给定一个树,他的父亲节点 和儿子节点有 邻接关系,选了父亲就不能选儿子,每个点有固定的价值,问你咋选,价值最大。 我开始的状态转移思路是(每个节点存在两种状态,分别是算本身的价值和 不算本身节点(只算儿子节点)的价值)。 然后 每次 转原创 2017-09-03 20:37:46 · 202 阅读 · 0 评论 -
POJ2479&poj2593-双连续子段和-Maximum sum
http://poj.org/problem?id=2479 给你一个数列,问你他们最大的两个连续子段和 最大值为多少。 一个是好求得,两个的时候,可以先计算一个,然后在求另一个。 为什么呢,因为 动态规划的最优子结构性质。 两个最大,一个当然也最大咯。(是会出现连个相连的情况的,题目中也没有排除这种情况、)#include <iostream>#include <cstdio>#inc原创 2017-08-02 20:05:12 · 178 阅读 · 0 评论 -
HDU1160-LIS&路径记录-J - FatMouse's Speed
https://vjudge.net/contest/170788#problem/J 给定一组老鼠的重量和速度,要求找到最大的一组。 重量上升,速度却在下降。 我的思路,先给速度降序,在重量建立一个数组,求LIS。并且记录路径。 记录路径我直接用的链表,,事实证明这样有点麻烦 qwq#include<bits/stdc++.h>using namespace std;const in原创 2017-08-09 19:16:26 · 187 阅读 · 0 评论 -
hdu1257-贪心&LIS-最少拦截系统
中文题意。 发现LIS,最长上升子序列即是答案 好想acdramer神还有其他的研究qwq #include <bits/stdc++.h>using namespace std;int main(){ int t; int a[30006]; while(~scanf("%d",&t)){ for(int i=0;i<t;i++){原创 2017-08-09 18:46:16 · 166 阅读 · 0 评论 -
Codeforces Round #383 (Div. 2)D-(并查集&分组背包)|(搜索&01背包)
传送门 分组背包模板题。 用并查集搞一搞一齐的关系就好。 然后就是分组背包的模板了,注意,在分组的时候,把i组所有和加起来 这一个虚拟的物品分到 i组里,而不能独立分组,不然会造成某一个模特的的多次使用。。 或者用搜索,这个搜索用滚动数组的时候,类似于树形dp里面,在一个树内进行01背包。 但是在遍历的时候,可能会出现从0数组 转到0数组的情况(1数组先前已经被vis掉了,如果我们不原创 2017-07-08 20:23:02 · 385 阅读 · 0 评论 -
HDU1069-LIS变形-Monkey and Banana
http://acm.hdu.edu.cn/showproblem.php?pid=1069 我又开始热爱这个世界了。 给定m,然后是 m个长方体,分别给a,b,c,是长宽高。 让你曡这些长方体,要求下面的那个长度和宽度不能比上面的小, 每个长方体可以供应好多(意思就是可以每个都可以换种姿势摆。) 问你最大的高度。 数据小于30,所以我就枚举所有种情况,然后按照最长上升子序列的思想,给搞原创 2017-07-18 20:57:29 · 208 阅读 · 0 评论 -
好题-HDU5135-壮压|贪心-Little Zu Chongzhi's Triangles
http://acm.hdu.edu.cn/showproblem.php?pid=5135 给定m个木棍,把这些木棍组成三角形。可以不用完,问你最多摆成的三角形面积和最大。 我开始的思路是 暴力枚举所有状态,然后在判断是否有交集。。 因为要考虑要组成多少个,所以还要三个if。。 全部搞定之后,在用压位的思想来判断,但是后来觉得压位判断有点麻烦,如果一个三角形占了1 3 5,还要考虑他和一个原创 2017-07-31 16:11:10 · 282 阅读 · 2 评论 -
HDU1176-基础dp-免费馅饼
https://vjudge.net/contest/170788#problem/G 看来我也只会写这种基础的dp了qwq 中文题意。 直接递推。 dp[i][j]为i秒j位置的最优解。 而在i秒j位置总共就这几种来源。。找一个最大的。 注意,开始没有注意起始位置,wa了两发。#include <iostream>#include <cstdio>#include <cstring原创 2017-07-23 20:13:34 · 204 阅读 · 0 评论 -
HDU1260-基础DP-H - Tickets
https://vjudge.net/contest/170788#problem/H 给定n个人 他们独自购票的时间 和他们临近人买票的时间, 问你如何选择,可以使时间最短。 得到状态转移方程。 dp[i]=min(dp[i-1]+单人i,dp[i-2],双人);#include <iostream>#include <cstdio>#include <cstring>#incl原创 2017-07-23 20:54:42 · 418 阅读 · 0 评论 -
HDU1114-基础dp&完全背包-F - Piggy-Bank
https://vjudge.net/contest/170788#problem/F 给定一个存钱罐初始重量和装了钱币的重量, 给定每种钱币的 重量和价值。 问你最小的价值是多少。 可知是 正好装下,dp[0]变成0,其余无穷大。 若是不要求装满,则全部为0 然后是完全背包了#include <iostream>#include <cstdio>#include <cstdio>原创 2017-07-23 20:58:41 · 221 阅读 · 0 评论 -
nefuoj1208-计数dp-原地爆炸
http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1208 n天,每天可能考试,也可能不考试。如果连续考m天就会爆炸, 问你不爆炸的方案数是多少。 dp[i][j]表示前i天,已经有j天连续爆炸的情况。 1 第i天不爆炸,以前的天数影响自动取消。 2 第i天爆炸,但是要保证他的爆炸天数不超过iinclude incl原创 2017-07-24 21:14:10 · 348 阅读 · 0 评论 -
HDU6092-2017多校5&&背包&贪心-Rikka with Subset
http://acm.hdu.edu.cn/showproblem.php?pid=6092 给定a数组。给定他的长度n, 再给你m。 问你他的所有子集中和为 0-m的 数量。数组B(显然子集数量为pow(2,n))个。 如果有很多结果,就输出字典序最小的那个。 字典序最多的那个要求尽可能每次取最小的。 当第一个不为0的B数组中的元素,肯定是最小的。 然后反向背包,把他这一种情况给去掉原创 2017-08-09 14:42:57 · 424 阅读 · 0 评论 -
hdu1003-最大子段和&细节-Max Sum
http://acm.hdu.edu.cn/showproblem.php?pid=1003 恩。。应该每次都先更新max。在判定是否为负数的。 dp[i]=max(sum,0). sum是前缀。 不然当 都为负数的时候,就无法判断了。#include <bits/stdc++.h>using namespace std;const int maxn=1e5+3;typedef lon原创 2017-09-04 20:32:28 · 228 阅读 · 0 评论 -
poj3140-树型dp&搜索-Contestants Division
https://vjudge.net/problem/17374/origin 给定一个树,问你抛去一个边,两边点权和的差最小是多少。。 好像树的重心。。开始想着枚举一遍和 重心相近的点,后来一看我去直接 枚举点 的两颗子树不就行了。。 wawawa。。 于是乎 想了好久。。原来求 反树的时候,,我用的m- siz[u].. 而其实应该计算 一下所有学生人数的(这是带权的,而不是求点的数...原创 2017-09-06 15:51:33 · 223 阅读 · 0 评论 -
hdu6071-最短路&思维&多校4&同余-Lazy Running
http://acm.hdu.edu.cn/showproblem.php?pid=6071 给定四个点,构成一个矩形,和他们四个点两点之间的距离。 问你从2出发,再回到2,长度大于k的最短路。。 思路: 如果从2到达某点,再回到2不到,可以移动若干个2*m(m为2和临近点的距离)。个,来得到大于k的条件。 用dij算出到达i点并且mod 2*m为j的点。(这个最短路会一直执行,直到把这个原创 2017-09-02 09:35:04 · 243 阅读 · 0 评论 -
vijosp1037-类背包问题&好题-搭建双塔
https://vijos.org/p/1037 问你用以下的数字构建两个 相同高度的双塔,尽可能的高。 开始的思路是 背包计数。 如果 dp[m] 和dp[m/2] 和m%2==0 都满足,那么我们就可以输出m/2 (m和 m/2 这些数字都能拼出来。。) 但是即使这样,其实也不一定是可以的,因为很可能 m/2构成的两次使用了重叠的项,而我们并没有阻止这一种情况// 这时错误的代码。过了原创 2017-09-19 18:28:00 · 327 阅读 · 0 评论 -
vijos1059-背包计数-积木城堡
用不同的正方体积木建造 n个城堡。 要求建造的时候 下面的比上面的大。 为了让 n个城堡一样高,可以拿走他们中的积木。 问你最大高度多少 城堡累放的规则,没有什么意义啊qwq 用01背包 统计 出现每个城堡的高度的出现次数, 然后 从大到小 统计哪个 高度在n个城堡均出现。 这样比较麻烦一点,用的空间也比较大。 可以 用&操作,这样只保留 一个一维数组就行,岂不美哉。#inclu原创 2017-09-19 20:33:25 · 765 阅读 · 0 评论 -
51nod1051-衍生最大子段和&枚举-最大子矩阵和
https://www.51nod.com/onlineJudge/problemSubmitList.html#!problemId=1051 给你一个矩阵,问你最大的子矩阵和是多少。 (本来想维护一个前缀和,然后弄一弄他的两个端点,但是没想出来。。) 在讨论区看了别人的代码恍然大悟,原来就是多维的 最大子段和。。 枚举端点。但是这道题有一个坑的地方,矩阵的输入不是正常的角度。。 坑死我原创 2017-09-20 11:00:54 · 297 阅读 · 0 评论 -
vijosp1071-01背包&记录组合&细节-新年趣事之打牌
https://vijos.org/p/1071 给定一群牌,和他的重量。 再给某个牌堆重量和,问在这个牌堆中那些牌没有出现。 如果没有,就输出0. 如果有,就从小到大输出。 如果有多种情况,就输出-1. 思路:先用背包判断是否会有多种情况(牌堆 或者牌堆剩下的数 都可以)。 如果只有一种。那么就背包牌堆数,然后记录当前重量时 使用的牌号。(这种方法显然无法计算最优解,只是用来计数。)原创 2017-09-20 14:16:29 · 438 阅读 · 0 评论 -
51nod1636-基础dp&打表-教育改革
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1636 中文题意,不在赘述。 首先写的一个回溯,被一组数据卡了。(应该是这一组非法状态太多) 考虑到每门科目的作业区间很小。用动态规划搞之。 dp[i][j][k] 为1-i天,末尾为j课程,选择的作业数目为k(考虑到太大,用和左边界的差值表示) 原题中还有x和y原创 2017-10-23 12:41:05 · 590 阅读 · 0 评论 -
51nod1875-打表&模拟-丢手绢
https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1875 这种循环中又删除的,用vector和取余完全可以搞定。。 参考的别人的代码,自己没有想到。 真的菜。#include <bits/stdc++.h>using namespace std;/**/bool vis[200];bool sol(int原创 2017-10-24 18:55:06 · 309 阅读 · 0 评论 -
hdu6228-搜索&类似树的重心-Tree
http://acm.hdu.edu.cn/showproblem.php?pid=6228 这道题其实不是树的重心,只是一个搜索qwq 给定一个无根树,问你把树的任意点染成某个颜色,总共有k个颜色,然后没个颜色相互连接,把那些连接用的边搞成一个集合,总共k个集合,每个集合要求里面的边尽可能的小,问你这些集合的最大交集 有多少 思路:以前做过树的重心,树的重心满足一点,就是这个重心去掉之后,树原创 2017-11-05 16:49:47 · 323 阅读 · 0 评论 -
Codeforces Round #436 (Div. 2)-背包&排序&输出状态-E. Fire
http://codeforces.com/contest/864/problem/E 给定若干个文件。 和整理他们花费的时间,他们的截止时间,和他们的价值。 问如何弄 价值最大。并输出文件数整理的顺序。和文件数量。 是背包。但是没想到怎么背。 先对截至日期排序。 dp[j]是截止到时间j。最大价值。 找到最大价值。然后再背包的过程中,保留用到i时的j(时间)。 然后从后往前,记录。原创 2017-09-27 12:58:40 · 231 阅读 · 0 评论 -
经典算法学习-循坏赛日程表-分治|递推|压位lowbit
① 问题描述 设有n=2^k个运动员,要进行网球循环赛。现在要设计一个满足以下要求的比赛日程表 (1).每个选手必须与其他n-1个选手各赛一场 (2).每个选手一天只能赛一次 (3).循环赛一共进行n-1天。 ② 这种表只有一种情况。可以用经典的分治来做。 发现 当表的长度为4时,存在 1 2 3 4 2 1 4 3原创 2017-09-18 13:09:52 · 660 阅读 · 0 评论 -
hdu6170-多看几遍之DP&递推&字符串-Two strings
http://acm.hdu.edu.cn/showproblem.php?pid=6170 给定两个串。 a串是正常串。 b串中有两种元素。 1 种是* ,可以让前面那个出现任意次(甚至让他出现0次) 2 是. 和任意字符匹配。 too young 系列。 日后,用搜索也写写,应该也行。 可以发现 几种状态转移。 ① 当为 . 时,这时没的说,由dp[i-1][j-1】得来 ②原创 2017-08-23 18:38:04 · 364 阅读 · 3 评论 -
Codeforces Round #419 (Div. 2)-树形dp&依赖背包&-E. Karen and Supermarket
http://codeforces.com/contest/816/problem/E 给定一个物品的 原价格 和现价格,问你如何买能让他在有限花费内物品最多。存在制约关系,比如买3必须买1。 树形dp。设置两种状态,一种是父节点用了打折卡。一种是父亲没有用打折卡。父亲用了二者卡,儿子不一定要用打折卡。(比方说这个打折卡就便宜了一毛钱,而加上那一毛就可以再买一个东西了) ※ 关键是 对树形背包原创 2017-09-06 13:52:21 · 264 阅读 · 0 评论 -
hdu5773-LIS&技巧-The All-purpose Zero
http://acm.hdu.edu.cn/showproblem.php?pid=5773 给定一个串,问你求lis。提一下,里面的0可以变成任意数。。 思路:先求一个lis。然后再加上0的个数 but,有的0是不能起作用的。。 可以让a[i]减去他前面 出现的0的个数。。。 具体看代码,梦里啥都有#include <bits/stdc++.h>using namespace std;原创 2017-09-14 19:55:38 · 163 阅读 · 0 评论 -
Vijos P1680-类LCS&&好好学着点-距离
https://vijos.org/p/1680 中文题意: 技巧: 动态规划,和lcs差不多。 dp[i][j] 表示a的i和b的j相互匹配的最大值。#include <bits/stdc++.h>using namespace std;const int maxn=2005;int dp[maxn][maxn];char s1[maxn];char s2[maxn];int原创 2017-09-15 12:48:07 · 219 阅读 · 0 评论 -
hdu5001-概率dp&经典&tooyoung-Walk
http://acm.hdu.edu.cn/showproblem.php?pid=5001 给你一个图,你可以任意从一个点出发,走k步,每步的概率都是等价的。问你不到达某个点的概率。。、 思路:我tm。完全不会这种玩法。 解释看代码。 注意:求走j步到达i的时候,在求步数小于k的时候,也不能让这些点到过u点(u就是当前计算概率的点,因为如果到达过了,那么就算到过了,而我们算的 到达其他点原创 2017-09-08 13:08:44 · 205 阅读 · 0 评论 -
Gym - 101490D-思维&好题&思考&递推-Bridge Automation
https://vjudge.net/problem/Gym-101490D 一群船要过一个桥(类似鸭绿江断桥那种桥,过船的时候需要把桥断开。) 给你每个时刻他们到达的时间,每条船最多等待30分钟(1800秒)。 桥开启,和关闭都需要60秒。 过船需要20秒。 问你如何使桥合理的开关,让影响交通的时间最少。 可以理解为一种动态规划。 1 枚举的船和 当前i船一起走。 共三种情况。原创 2017-09-25 19:40:32 · 358 阅读 · 0 评论 -
hdu5074-递推-Hatsune Miku
http://acm.hdu.edu.cn/showproblem.php?pid=5074 给一串数字,若为负数。。可以变化,若为正数,不能变。 问你他们 从任意相邻两个在一起构成一个价值r[i,j] 要求 价值和最大。 规定 r(i,j)为 左边为i,右边为j 的价值。 方法;保留长度为len, 后面大小为j的情况。 递推。#include <bits/stdc++.h>using原创 2017-09-09 17:28:32 · 239 阅读 · 0 评论 -
hdu2196-树形dp|树的直径-Computer
http://acm.hdu.edu.cn/showproblem.php?pid=2196 给定一个网络,是一个图,求每个节点到最远节点的距离。。 1 树的直径。 即树上的最长简单路(最长的一条线)。然后求出直径的两个端点, 在计算的时候记忆化一下,保存一下他们距离 端点的距离。然后取最远的。( 1 先求出距离一个端点的距离,用直径直接减去是不行的,,因为有的点并不在树的直径上。。原创 2017-08-23 10:24:48 · 284 阅读 · 0 评论