动态规划
JeremyGJY
然而并没有什么好说的
展开
-
【数位DP】[BZOJ 3876]支线剧情
题目描述Description【故事背景】 宅男JYY非常喜欢玩RPG游戏,比如仙剑,轩辕剑等等。不过JYY喜欢的并不是战斗场景,而是类似电视剧一般的充满恩怨情仇的剧情。这些游戏往往 都有很多的支线剧情,现在JYY想花费最少的时间看完所有的支线剧情。 【问题描述】 JYY现在所玩的RPG游戏中,一共有N个剧情点,由1到N编号,第i个剧情点可以根据JYY的不同的选择,而经过不同的原创 2016-04-07 17:52:29 · 772 阅读 · 0 评论 -
【动态规划】[BZOJ1037][ZJOI2008]生日聚会Party
题目描述今天是hidadz小朋友的生日,她邀请了许多朋友来参加她的生日party。 hidadz带着朋友们来到花园中,打算坐成一排玩游戏。为了游戏不至于无聊,就座的方案应满足如下条件:对于任意连续的一段,男孩与女孩的数目之差不超过k。很快,小朋友便找到了一种方案坐了下来开始游戏。hidadz的好朋友Susie发现,这样的就座方案其实是很多的,所以大家很快就找到了一种,那么到底有多少种呢?热爱数学的h原创 2016-02-05 13:24:07 · 1217 阅读 · 1 评论 -
【动态规划】【图论最长路】[NOIP模拟赛]益智游戏
题目描述 小P 和小R 在玩一款益智游戏。游戏在一个正权有向图上进行。 小P 控制的角色要从A 点走最短路到B 点,小R 控制的角色要从C 点走最短路到D 点。 一个玩家每回合可以有两种选择,移动到一个相邻节点或者休息一回合。 假如在某一时刻,小P 和小R 在相同的节点上,那么可以得到一次特殊奖励,但是在每 个节点上最多只能得到一次。 求最多能获得多少次特殊奖励输入 5 5 1 2 1 2原创 2015-10-22 13:24:31 · 1339 阅读 · 0 评论 -
【动态规划】【图论】[NOIP模拟赛]独立集
题目描述: 有一天,一个名叫顺旺基的程序员从石头里诞生了。又有一天,他学会了冒泡排序和独 立集。在一个图里,独立集就是一个点集,满足任意两个点之间没有边。于是他就想把这两 个东西结合在一起。众所周知,独立集是需要一个图的。那么顺旺基同学创造了一个算法, 从冒泡排序中产生一个无向图。这个算法不标准的伪代码如下:void bubblesortgraph(n,a[])//输入:点数n,1到n的全排列a/原创 2015-10-22 13:18:23 · 1512 阅读 · 0 评论 -
【动态规划】[NOIP 模拟赛]密码
题目描述:假发通过了不懈的努力,得到了将军家门锁的密码(一串小写英文字母)。但是假发被 十四和猩猩他们盯上了,所以假发需要把密码传递出去。因为假发不想十四他们发现几松门 前贴的小纸条就是将军家的密码,所以他加密了密码(新八:听起来有点诡异)。加密方法 如下:随机地,在密码中任意位置插入随机长度的小写字符串。 不过,假发相信银桑和他那么多年小学同学,一定能猜中密码是什么的(新八:银桑什 么时候成攮夷志原创 2015-10-22 13:13:39 · 1374 阅读 · 0 评论 -
【哈希】【动态规划】[NOIP模拟赛]仔细的检查
nodgd家里种了一棵树,有一天nodgd比较无聊,就把这棵树画在了一张纸上。另一天nodgd更无聊,就又画了一张。 这时nodgd发现,两次画的顺序是不一样的,这就导致了原本的某一个节点u0在第一幅图中编号为u1,在第二副图中编号为u2。 于是,nodgd决定检查一下他画出的两棵树到底是不是一样的。nodgd已经给每棵树的节点都从1到n进行了编号,即每棵树有n个节点。 如果存在一个1到n的排原创 2015-11-04 13:33:53 · 855 阅读 · 1 评论 -
【暴力搜索】【动态规划】[NOIP 1999]邮票面值设计
其实就是枚举每一个邮票的面值记得保持严格递增,然后DP判断每一次最多能够凑出1-哪个面值的邮票,然后下限显然就是前面一张邮票的面值+1,上限是当前能够凑出的邮票的面值+1因为显然如果当前最大为nn那么如果这张面值为n+2n+2那么显然n+1n+1不能由原来的组合构成(原来只能弄出nn)那么现在新加入了一个只会变得n+2>n+1n+2>n+1那么显然n+1n+1永远凑不出来,那么显然同理不能选择大于n原创 2015-07-22 15:49:36 · 2394 阅读 · 0 评论 -
【动态规划】【状态压缩DP】[UVa 1354]Mobile Computing
其实就是枚举一下每一次左边的用那些右边的用那些,处理一下当前所有组合的左端点和又短点就行了#include <cstdio>#include <algorithm>#include <vector>#include <cstring>#include <iostream>using namespace std;const int MAXN = 6;typedef pair<double原创 2015-07-17 22:27:31 · 991 阅读 · 0 评论 -
【数论】【矩阵加速】[POJ3070]Fibonacci
题目描述In the Fibonacci integer sequence, F0 = 0, F1 = 1, and Fn = Fn − 1 + Fn − 2 for n ≥ 2. For example, the first ten terms of the Fibonacci sequence are:1, 1, 2, 3, 5, 8, 13, 21, 34, …样例输入0 9 999999原创 2016-03-01 13:37:11 · 655 阅读 · 0 评论 -
【数论】【动态规划】[BZOJ1004][HNOI2008]Cards
题目描述小春现在很清闲,面对书桌上的N张牌,他决定给每张染色,目前小春只有3种颜色:红色,蓝色,绿色.他询问Sun有多少种染色方案,Sun很快就给出了答案.进一步,小春要求染出Sr张红色,Sb张蓝色,Sg张绝色.他又询问有多少种方案,Sun想了一下,又给出了正确答案. 最后小春发明了M种不同的洗牌法,这里他又问Sun有多少种不同的染色方案.两种染色方法相同当且仅当其中一种可以通过任意的洗牌法(即可以原创 2016-02-02 14:50:48 · 669 阅读 · 0 评论 -
【动态规划】[USACO2016 金组]Circular Barn Revisited
题目描述After the last debacle involving Farmer John’s circular barn, one would think he had learned his lesson about non-traditional architecture. However, he thinks he can still make his circular barn (f原创 2016-03-12 16:04:51 · 1255 阅读 · 1 评论 -
【单调队列】【动态规划】[CQBZOJ3059]Bead
题目描述Alex 喜欢玩网络游戏,认为这是智力和体力的综合锻炼。在一次游戏活动中, 他意外获得了一个传说中威力极其强大的法宝:珠链。 珠链,顾名思义,就是由许多小珠子串起来的一条链。珠子有很多种颜色。 Alex 听说过,只有将珠链打磨纯净,珠链才能发挥最大的威力。 纯净珠链是指这样的珠链:它可以分成若干个长度相等的段,使任何两段的 任何相同位置的珠子的颜色均不同,相同位置指珠子在段内的相对原创 2016-03-08 15:27:49 · 715 阅读 · 1 评论 -
【动态规划】【数位DP】[Codeforces 55 D]Beautiful numbers
题目描述Volodya is an odd boy and his taste is strange as well. It seems to him that a positive integer number is beautiful if and only if it is divisible by each of its nonzero digits. We will not argue w原创 2016-02-17 20:59:09 · 178 阅读 · 0 评论 -
【动态规划】【数位DP】[SPOJ10606]Balanced numbers
题目描述Balanced numbers have been used by mathematicians for centuries. A positive integer is considered a balanced number if:1) Every even digit appears an odd number of times in its decimal represe原创 2016-02-17 19:37:21 · 910 阅读 · 1 评论 -
【动态规划】【数位DP】[2015 Multi-University Training Contest 7]Gray Code
题目描述The reflected binary code, also known as Gray code after Frank Gray, is a binary numeral system where two successive values differ in only onebit (binary digit). The reflected binary code was origi原创 2016-02-17 19:17:45 · 610 阅读 · 1 评论 -
【动态规划】【数位DP】[PA 2015]Rownanie
题目描述对于一个正整数 n,定义 f(n)f(n) 为它十进制下每一位数字的平 方的和。 现在给定三个正整数 k,a,b,请求出满足 a≤n≤b 且 k×f(n) = n 的 n 的个数。 1≤k,a,b≤10^18 a≤b样例输入51 5000 10000样例输出3题目分析可以发现当每一位都取9的时候答案最大,那么我们可以发现最大的平方和为92×18=14589^2\times18=1458原创 2016-02-17 18:32:53 · 814 阅读 · 0 评论 -
【斜率优化】[CEOI2004]锯木厂选址——从这里开始斜率优化的大门
题目好久没有碰过斜率优化了,我们从这里来开始复习一下, 先看一下题目: 从山顶上到山底下沿着一条直线种植了n棵老树。当地的政府决定把他们砍下来。为了不浪费任何一棵木材,树被砍倒后要运送到锯木厂。木材只能按照一个方向运输:朝山下运。山脚下有一个锯木厂。另外两个锯木厂将新修建在山路上。你必须决定在哪里修建两个锯木厂,使得传输的费用总和最小。假定运输每公斤木材每米需要一分钱。题目解析定义: wiw_i原创 2016-02-03 22:33:36 · 1080 阅读 · 0 评论 -
【动态规划】【斜率优化】[BZOJ1010][HNOI2008]玩具装箱toy
题目描述P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京。他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中。P教授有编号为1…N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的。同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i件玩具到第j原创 2016-02-03 13:39:42 · 875 阅读 · 0 评论 -
【动态规划】【树状数组】[USACO2011 FEB]奶牛抗议
这道题目的关键就是想到用树状数组对DP进行优化,首先令f(i)f(i)表示分到第i个的时候子段和大于等于0的时候出现的最大的种树, 那么可以发现f(i)=∑f(j)|sum(i)−sum(j)≥0f(i)=\sum f(j) | sum(i)-sum(j)\ge 0那么后面的部分可以变成sum(i)≥sum(j)sum(i)\ge sum(j)那么就可以使用树状数组进行维护,下标就是sum(j)su原创 2015-07-17 22:10:07 · 762 阅读 · 0 评论 -
【动态规划】[USACO2011 OPEN]修剪草坪
这道道题目就是个动态规划另f(i)f(i)表示在i的位置上的时候的最大值那么f(i)=sum(i)+max{f(j)−sum(j+1)}f(i)=sum(i)+max\{f(j)-sum(j+1)\}那么发现如果j超出i-k-1的范围就没有意义了,用单调队列优化一下就好了#include <cstdio>#include <algorithm>#include <cstring>#includ原创 2015-07-16 14:41:54 · 1125 阅读 · 0 评论 -
【动态规划】[UVa 1099]Sharing Chocolate
实际上就是另f(S,i)f(S, i)表示在集合S中的所有面积的巧克力能不能被组成一个长高为ii的大的巧克力,那么显然 长宽是可以交换的那么只考虑高小于宽的情况就行了。那么f(S,i)=f(S−S0,min{i,Sum[S−S0]/i})f(S, i)=f(S-S_0, min\{i, Sum[S-S_0]/i\}) 同时f(S0,min{i,Sum[S0]/i})f(S_0, min\{i, Su原创 2015-07-16 14:36:44 · 551 阅读 · 0 评论 -
【后缀自动机】[BZOJ 2806]Cheat
题目描述:就是给你多个01串当作字典然后给你另一个01串问你这个01串长度90%以上被匹配时的分段匹配的段的最大值L0L_0(这个最大值是当前分段每一段的最小值,就是每一段长度都大于这个值,求这个值的最大值) 我看到这道题就知道要把所有的字典的串合成一个串来搞,原来弄过一个AC自动机的题目和这个描述很像,自然而然就这么弄了,建立SAM的时候每一个串之间弄个分隔符。原因不说了。现在我们只要先求出每一原创 2015-06-11 22:28:27 · 662 阅读 · 0 评论 -
【动态规划】【多重背包】[HDU 1059]Dividing
实际上就是统计一下所有的元素一共有多少,如果是一个奇数那么肯定不能被分成两半,如果是一个偶数,那么就开一个总和的一半的背包,然后看背包最大能够装多少,如果可以刚好装满,那么说名肯定可以被分成两半,然后因为数量有限,所以搞一个多重背包,我的代码如下:#include <cstdio>#include <cstring>#include <algorithm>using namespace std原创 2015-06-24 15:00:40 · 626 阅读 · 0 评论 -
【动态规划】【多重背包】[HDU 1291]悼念512汶川大地震遇难同胞――珍惜现在,感恩生活
这道题目是一个多重背包的题目,多重背包实际上就是把整个物品的件数拆分成a0∗20+a1∗21+a2∗22+...an∗2na_0*2^0+a_1*2^1+a_2*2^2+...a_n*2^n且a=0或1a=0或1这样每一次最优解实际上就是在之前的基础上进行的最优解的累加,但是发现如果物品数量不是恰好是某几个数之和,那么就会出现有几个统计不到的情况,那么只要提出来单独处理这多出来的件数的背包就好了。原创 2015-06-24 13:45:46 · 1042 阅读 · 0 评论 -
【动态规划】[BZOJ 1296]粉刷匠
这道题实际上就是先预处理每一行的最优f(i,j)f(i,j)表示每一行前i个粉刷j次做多刷正确的数量那么每次枚举起点位置kk那么显然f(i,j)=max(f(k,j−1)+max(sum[i]−sum[j],i−j−sum[i]+sum[j]))f(i,j)=max(f(k,j-1)+max(sum[i]-sum[j],i-j-sum[i]+sum[j]))如果说不放那么在循环之前先令f(i,j)=原创 2015-06-23 19:04:17 · 926 阅读 · 0 评论 -
【动态规划】【最短路】[BZOJ 1003]物流运输trans
简直是醉了,这道题本来想了一会儿,然后看了看数据边的数量顶天了才400然后时间最多才100那么直接用SPFA 复杂度O(nm2)O(nm^2)就可以过了,然后注意一下特别判定是否超过INF可能有数据很极限,判断一下是否超过了INF没有才运算,我被这个小问题卡了好久。。。然后就是枚举当前连续一段的起始时间和结束时间然后f(i)=min(f(j)+SPFA(i,j)×(i−j)+k)f(i)=min(f原创 2015-06-19 21:29:35 · 1000 阅读 · 0 评论 -
【动态规划】[POJ 1088]滑雪
意思就是把所有点存下来,按照高度排个序, 然后从小到大枚举,然后判断当前的点的四个方向有没有存在经过当前点更优的情况,并且那个点的高度比当前点的高度要高如果存在就更新,因为根据大小排了序,所以不会出现不会出现一个点重复统计的情况那么复杂度是O(n2)O(n^2)#include <cstdio>#include <cstring>#include <algorithm>using namesp原创 2015-06-19 13:31:53 · 593 阅读 · 0 评论 -
【动态规划】[POJ 1050]To the Max
就是最大矩阵和,如果直接爆搜复杂度就是O(n4)O(n^4)的所以进行优化,sum[i][j][k]表示在第i列到第j列的第k行的和,那么就枚举i, j然后最大子段和,然后就变成O(n3)O(n^3)了, 反正n只有100就过了#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const in原创 2015-06-19 13:17:12 · 344 阅读 · 0 评论 -
【动态规划】[Uva11270]Tiling Dominoes
这道题就是连通性状态压缩DP,复习了一下。#include <cstdio>#include <iostream>#include <cstring>#include <map>using namespace std;long long dp[11][11][(1<<11)+1][2], n, m;long long dfs(int x, int y, int md, int right原创 2015-05-05 13:52:09 · 708 阅读 · 0 评论 -
【动态规划】[UVA 437]The Tower of Babylon
令dp(i,j)dp(i,j)表示用第i个方块做底其中第j条边做高的时候所可以得到的最大高度那么显然dp(i,j)=min{dp(k,p)}+h(i,j)dp(i,j)=min\{dp(k,p)\}+h(i,j)同时要求第k个的底面严格小于i的底面。这道题就是这样。#include <cstdio>#include <cstring>#include <algorithm>using name原创 2015-07-13 11:46:09 · 320 阅读 · 0 评论 -
【动态规划】[POJ 1742]Coins
这道题代码很短,实际上就是令dp(i)dp(i)表示是否可以组成i这么大的面值然后sum(i)sum(i)表示当前组成i这么大的数字用了多少个当前的数字,然后循环的时候维护sum的值不超过可用范围就行了#include <cstdio>#include <algorithm>#include <cstring>using namespace std;const int MAXN = 1000原创 2015-07-13 14:09:11 · 440 阅读 · 0 评论 -
【动态规划】[COCI]摘樱桃
这道题目实际上我们首先看看题目描述 摘樱桃(cherry) 拉娜生活在一个美丽的小村庄。在大街的一旁有一排樱桃树,编号从1到N. 在反复研究后,拉娜发现树的编号神奇的决定了这棵树的樱桃数。 对每一棵树,考虑树的编号中连续的几个数段,对每一数段,该数字乘上这个数段的长度的平方再全部相加,就得到这棵树能够结的樱桃数。 比如,树的编号是77744007,数段分别为777,44,00和7。樱桃数就是7*3原创 2015-08-24 16:45:58 · 1091 阅读 · 0 评论 -
【动态规划】[POJ 2288]Islands and Bridges
这倒题太坑了。。。简直。。。明明没有错误的代码就是A不了。。 题目分析另f(state,i,j)f(state, i, j) 表示在状态为state的情况下当前在i点前一个点是j点的所能够得到的最大的乘积那么很容易发现f(state+(1<<k),k,i)=f(state,i,j)+v[k]+v[k]×v[i]|G[j][k]=0f(state+(1<<k),k,i)=f(state,i,j)+v原创 2015-07-15 16:57:21 · 434 阅读 · 0 评论 -
【动态规划】[UVa 11825]Hackers' Crackdown
这道题目用DP来搞首先题目可以看成把所有的计算机分成很多组每一组的都关闭同一种服务,同时这一组的关闭能够关闭所有的计算机,那么另SS为当前的所有计算机的集合另S0S_0为SS的子集另全集(所有计算机)为S′S'那么可以很容易的发现f(S)=max{f(S0)+(S′==cover(S0))}f(S)=max\{f(S_0)+(S'==cover(S_0))\}其中cover(S0)cover(S_0原创 2015-07-15 17:34:45 · 435 阅读 · 0 评论 -
【动态规划】【树形DP】[BZOJ 1040]骑士
首先可以发现肯定这个图是一个森林,而且在这个森林之中只有一个环,那么只要找到这个环上的任意一条边(删掉这条边)然后对这条边的两个端点分别作两次最大独立集,然后分别取两个点中不取的情况的最大值,然后这个值就是要找的了,因为只有一个环,所以我找环的方法是用并查集的方法。。#include <cstdio>//#include <conio.h>#include <algorithm>#includ原创 2015-07-15 10:44:38 · 494 阅读 · 0 评论 -
【动态规划】【树形DP】[UVa 10859]Placing Lampposts
首先很容易可以得到另f(i,j)f(i,j)表示第i盏灯的父亲是否点亮所以j=0|1j=0|1如果父亲放了,那么自己放或者不放都可以那么f(i,j)=max{∑f(ison,0)∑f(ison,1)}f(i,j)=max\{\sum{f(ison,0)}\sum{f(ison,1)}\},如果父亲没有放置,那么自己必须放那么f(i,0)=∑f(ison,1)f(i,0)=\sum{f(ison,1)原创 2015-07-15 10:28:16 · 505 阅读 · 0 评论 -
【动态规划】[UVa1625]Color Length
分析一下发现如果每一次放进去一个新,它就会对所有覆盖这个点的所有颜色的L加1那么另add(i,j)add(i,j)为第一个放到i第二个放到j放完之后这种状态有多少组交叉那么有int add(int x, int y) { int cnt = 0; for(int i=0;i<26;i++){ if(pos[i][1] <= x && pos2[i][1] <= y)原创 2015-07-13 14:02:43 · 533 阅读 · 0 评论 -
【动态规划】[POJ 1229]Wild Domains
其实就是把每一部分的内容缩成一个点,然后把每一个特殊意义的符号用方便表示的符号表示出来 比如 (@表示必须选一个, #表示选择1个或者不选,的含义和*一样) ! -> @@# * ->的含义和*一样) ! -> @@# * -> ? -> @## 然后if(check(str[0][i][0]) || check(str[1][j][0])){原创 2015-07-13 13:56:54 · 491 阅读 · 0 评论 -
【动态规划】[UVa11584]Partitioning by Palindromes
我们令f(i,j)f(i,j)表示在字符串中从i-j的回文串的分割后的最小次数,那么可以很容易的发现f(i,j)=min{f(i,k)}+1f(i,j)=min\{f(i,k)\}+1条件是从k+1到i的这几个字符串是回文串,那么才可以进行分割,这道题目唯一要注意的地方就是注意在预处理回文串的判断的时候要注意奇数串和偶数串#include <cstdio>#include <algorithm>原创 2015-07-13 11:55:19 · 421 阅读 · 0 评论 -
【动态规划】[HDU1693] Eat the Trees
dp[i][j][k] i , j 代表的是当前枚举到的坐标, 然后k代表当前的结束后分割的线的方案,这个分割线的上方是已经dp完了的内容这条分割线用01表示代表该位置是否有东西穿过, 递推就行了#include <cstdio>#include <cstring>#include <algorithm>#include <iostream>using namespace std;type原创 2015-04-11 16:03:03 · 430 阅读 · 0 评论