![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DP
EMber _
人但有追求,世界亦会让路。
展开
-
CQOI2012局部极小值 BZOJ2669 状压DP+容斥
题意:给定一个n∗m的矩阵,标记出其中的局部极小值,要求填入1…n∗m,求方案数 这题我刚看还以为是搜索之类的。。后来看见数据范围才发现是DP。。没想到要用容斥。 切了一下午,题解都没听。。上去讲了一下自己的想法就没听了。。当时感觉快改出来了。。结果吗。。赫赫,因为没有清零而导致tle我是绝对不会告诉你们滴~~ 推荐一下PO姐的解法,讲的很明了,,这里也会有部分借鉴== http://blo原创 2016-08-15 20:10:34 · 506 阅读 · 0 评论 -
JZOJ 4700 简单DP
题意: 看着好像挺简单,就是把限制换了个样子,事实上。。。 还是很简单。 我不会告诉你们我二十分钟就打完但是交的时候网络挂了导致我这题0分 题解: uses math;var i,j,k,p,n,m,ans:longint; v,w:array[0..100000]of longint; f:array[0..5000,0..5000]原创 2016-08-17 21:11:36 · 246 阅读 · 0 评论 -
(BestCoder Round #59 (div.1) B)简单DP
(改编版,题意相同) Description火神为了检验zone的力量,他决定单挑n个人。 由于火神训练时间有限,最多只有t分钟,所以他可以选择一部分人来单挑,由于有丽子的帮助,他得到了每个人特定的价值,每个人的价值由一个三元组(a,b,c)组成,表示如果火神在第x分钟单挑这个人(x指单挑完这个人的时间),他就会得到a-b*x的经验值,并且他需要c分钟来打倒这个人。 现在火神想知道,他最多原创 2016-08-14 15:25:05 · 267 阅读 · 0 评论 -
51nod 1201
题意:给你一个整数n(n<=50000),n可以划分为多个整数相加的和,现在要求总方案,但是组成n的整数不能相同。题解:这题目比较锻炼思维,我一开始n<=50000还以为是O(n)…思维太狭窄了。。因为要求每个整数都不相同。所以我们假设最多需要多少整数,即:1+2+3+…+x 假设n为最大50000,那么x最多也就350左右的样子((1+350)*350/2>50000)所以我们只要找350个左右原创 2016-10-21 20:11:21 · 261 阅读 · 0 评论 -
51nod 1254最大子段和V2
题意:让你能随意有一次机会交换任意两个数,然后求最大子段和。 题解:我们可以把这个题意变形一下:假设x只能和他前面的数交换,求最大子段和。变形以后就可以正反各做一遍然后统计答案就可以了。具体变形之后的O(N)DP怎么做请看佐理慧大神的题解https://www.51nod.com/question/index.html#!questionId=1078 我只能说我智商低下。。没有把max数组分左原创 2016-09-27 16:44:36 · 767 阅读 · 0 评论 -
JZOJ 4886 字符串 KMP+DP
Description某日mhy12345在教同学们写helloworld,要求同学们用程序输出一个给定长度的字符串,然而发现有些人输出了一些“危险”的东西,所以mhy12345想知道对于任意长度n的小写字母字符串,不包含危险串的字符串个数Input多组数据,以EOF结束。对于每组数据,第一行一个数n,表示字符串的长度,第二行一个字符串str表示危险串。Output对于每组数据,输出一个整数表示答案原创 2016-11-11 20:07:34 · 413 阅读 · 0 评论 -
bzoj1042 dp+容斥
Description 硬币购物一共有4种硬币。面值分别为c1,c2,c3,c4。某人去商店买东西,去了tot次。每次带di枚ci硬币,买s i的价值的东西。请问每次有多少种付款方法。Input 第一行 c1,c2,c3,c4,tot 下面tot行 d1,d2,d3,d4,s,其中di,s<=100000,tot<=1000Output 每次的方法数Sample Input1 2 5 10原创 2017-02-16 16:00:48 · 208 阅读 · 0 评论 -
poj3691DNA repair AC自动机+dp
题目的意思是给你一些串,然后给你一个大串,问你要在这个大串上最少修改多少个地方使得这个大串不含任何一个小的串。分析:经典套路,直接dp,还是设f[i,j]表示走到大串的第i个位置,然后直接把模板串往trie上贴就行了,如果当前位置trie上的字母和模板串相同自然不用修改,否则就+1咯。当然不能走单词的末尾节点,直接跳过就可以了。最后注意一下边界,还有如果你是直接读串的话c++是dp的状态和子串的位置原创 2017-02-17 15:39:52 · 290 阅读 · 0 评论 -
codeforces 721C DAG上dp
题意:给你一个有向图,让你求从1走到n最多能经过多少点,权值和小于t. n<=5000。 分析:这其实就是一个DAG上求最短路最长,dp就可以了,暴力一点,设f[i,j]表示从1-i走过j个点的最小时间。注意有可能是环所以dfs到n的时候直接退出。方案的话随便记录一下就行了。#include<cstdio>#include<algorithm>#include<cstring>#inclu原创 2017-02-18 09:55:01 · 320 阅读 · 0 评论 -
bzoj1974&jzoj1523 [Sdoi2010]auction 代码拍卖会
题意:当一个数的每一位都比前一位大时,我们把这种数叫做上升数。现在给你n和k,让你求n以内有多少个上升数能整除,n<=10^18,k<=500。分析:大概能想到背包,但是细节很复杂所以就炸了。。。不得已膜了一波题解。。每一个上升数都可以分解为1,11,111,1111之类的数。那么我们可以找出所有的这种树,把他们分成k组,做分组背包。 令f[i][j][k]表示前i组里选j个数的和在模K意义下是k原创 2017-02-18 14:05:42 · 285 阅读 · 0 评论 -
poj2955 Brackets dp
题意:其实就是括号匹配。问题是我看错了题目了,我以为要n^2做,结果搞了半天才过。。 一看别人的题解我日怎么这么短。。结果才发现是n^3.。 所以为了排名我有重新打了个n^3的。。 n^2的话比较复杂,想问的话站内留个言给我就行,反正一直都在。。 code:#include<iostream>#include<cstdio>#include<algorithm>#include<cst原创 2017-02-18 15:37:47 · 213 阅读 · 0 评论 -
poj 1651Multiplication Puzzle dp
原来我是真的水。。裸矩阵连乘我怎么还想着用贪心呢。#include<cstdio>#include<algorithm>#include<cstring>//#include<cmath>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;ty原创 2017-02-18 16:00:21 · 196 阅读 · 0 评论 -
codeforces 149D Coloring Brackets 区间DP
题意:给你一串括号,每个括号可以涂色,蓝色或者红色或者不涂,问你有多少种方案数,其中涂色有些限制。 1.每对括号有且仅有其中一个被涂色。 2.相邻的括号不能涂相同的颜色,但是相邻的括号可以同时不涂色。那我们怎么做呢。 首先他已经给出了一个合法的括号序列,我们只要找每个左括号右边的第一个右括号就可以了,设dp[l][r][x][y]表示l到r这段区间的答案,l和r的颜色分别为x和y的方案数(0/原创 2017-02-18 16:56:46 · 662 阅读 · 0 评论 -
BZOJ1026 SCOI2009WINDY数
Description windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道, 在A和B之间,包括A和B,总共有多少个windy数?Input 包含两个整数,A B。Output 一个整数Sample Input【输入样例一】1 10【输入样例二】25 50 Sample Output【输出样例一】9【输出样例二】20 HI原创 2017-02-19 08:37:34 · 333 阅读 · 0 评论 -
BestCoder Round #87 1003 LCIS
LCIS的模板来着的,时间复杂度是O(n),比较简单,直接设f,g分别为a和b以i结尾的lis长度,转移怎么暴力怎么来。。亏我以前还天天log求lis之后辛辛苦苦再求lcs。。。。#include<cstdio>#include<algorithm>#include<cstring>//#include<cmath>#include<iostream>#define fo(i,a,b) f原创 2017-02-19 08:57:58 · 251 阅读 · 0 评论 -
bzoj1055 [HAOI2008]玩具取名[区间DP]
Description 某人有一套玩具,并想法给玩具命名。首先他选择WING四个字母中的任意一个字母作为玩具的基本名字。然后 他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使得自己的名字能够扩充得很长。 现在,他想请你猜猜某一个很长的名字,最初可能是由哪几个字母变形过来的。 Input 第一行四个整数W、I、N、G。表示每一个字母能由几种两个字母所替代。原创 2017-02-18 20:33:52 · 1026 阅读 · 0 评论 -
bzoj 1030 AC自动机+DP
Description JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版。该软件可以随机生成一些文章―――总是生成一篇长度固定且完全随机的文 章—— 也就是说,生成的文章中每个字节都是完全随机的。如果一篇文章中至少包含使用者们了解的一个单词, 那么我们说这篇文章是可读的(我们称文章a包含单词b,当原创 2017-02-09 21:43:25 · 311 阅读 · 0 评论 -
bzoj 1875 矩阵乘法dp
DescriptionHH有个一成不变的习惯,喜欢饭后百步走。所谓百步走,就是散步,就是在一定的时间 内,走过一定的距离。 但是同时HH又是个喜欢变化的人,所以他不会立刻沿着刚刚走来的路走回。 又因为HH是个喜欢变化的人,所以他每天走过的路径都不完全一样,他想知道他究竟有多 少种散步的方法。 现在给你学校的地图(假设每条路的长度都是一样的都是1),问长度为t,从给定地 点A走到给定地点B共有多少条符原创 2017-02-19 15:17:16 · 417 阅读 · 0 评论 -
51nod 1378 夹克老爷的愤怒
1378 夹克老爷的愤怒 基准时间限制:1 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 夹克老爷逢三抽一之后,由于采用了新师爷的策略,乡民们叫苦不堪,开始组织起来暴力抗租。 夹克老爷很愤怒,他决定派家丁常驻村中进行镇压。 诺德县 有N个村庄,编号0 至 N-1,这些村庄之间用N - 1条道路连接起来。 家丁都是经过系统训练的暴力机器,每名家丁可以被派驻在原创 2017-02-11 10:54:35 · 370 阅读 · 0 评论 -
bzoj 2500 幸福的道路 动态规划+单调栈
题意:给出一棵树,每条边都有一个长度。我们规定每个点的权值为从该点开始走过的一条最长的路径的长度。 求一个最长的区间[l,r],使得[l,r]里面点权的最大值和最小值只差不超过m。 n<=1000000一开始看错题目了,结果卡了半天。。最后发现是一道大水题。 先求点权,直接DP求,经典模型啊。。随便写。 后面求出点权之后,单调队列就更简单了,随便搞。 然后等我切了以后看别人的题解才发现原创 2017-02-12 11:51:50 · 279 阅读 · 0 评论 -
bzoj 2286 SDOI2011 消耗战 虚树dp
题意就不说了。分析: 这题其实就是让你切代价最小的边使得k个点与根不联通,可以设一个和暴力的DP。设val[i]表示要让i和根断开的代价。很显然有f[i]=min(Σf[son],val[i])val[i]=max(len[i到fa[i]],val[fa[i]]);时间复杂度是O(N),加上询问以后就是O(NM),妥妥的超时。。一开始我还想着是不是要加上数据结构什么的,结果发现好像没有数据原创 2017-02-12 18:28:42 · 282 阅读 · 0 评论 -
bzoj 3611 [Heoi2014]大工程 虚树DP
题意就不说了,比较复杂,自己看吧。分析: 我还是naive了,居然想着直接做。。以后看见这种询问个数之和<=n的直接无脑上虚树。 至于虚树跟之前的那个消耗战差不多。但是dp就很复杂了,不好做,要把每个点单独 拿出来做。具体转移看标程吧。#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>原创 2017-02-12 22:18:55 · 243 阅读 · 0 评论 -
bzoj1806[ioi2007]Miners 矿工配餐
Description现有两个煤矿,每个煤矿都雇用一组矿工。采煤工作很辛苦,所以矿工们需要良好饮食。每当一辆食品车到达煤矿时,矿工们便会产出一定数量的煤。有三种类型的食品车:肉车,鱼车和面包车。 矿工们喜欢变化的食谱。如果提供的食品能够不断变化,他们的产煤量将会增加。每当一个新的食品车到达煤矿时,矿工们就会比较这种新的食品和前两次(或者少于两次,如果前面运送食品的次数不足两次)的食品,并且: • 如原创 2017-02-22 20:35:14 · 339 阅读 · 0 评论 -
tyvj 1519 博彩游戏 AC自动机+DP
背景 Background Bob最近迷上了一个博彩游戏……描述 Description 这个游戏的规则是这样的: 每花一块钱可以得到一个随机数R,花上N块钱就可以得到一个随机序列; 有M个序列,如果某个序列是产生的随机序列的子串,那么就中奖了,否则不中。 Bob会告诉你这M个序列,和身上有的钱的总数N,当然还有R的范围。 请你告诉Bob中奖的概率有多少?输入格式 InputFormat原创 2017-02-14 16:36:07 · 2497 阅读 · 0 评论 -
bzoj4300 绝世好题
真·绝世好题。。#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>using namespace std;int n,a[100];int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) { int tmp原创 2017-02-22 22:20:25 · 195 阅读 · 0 评论 -
bzoj1600
水DP不解释,然而我一开始以为递推。。算了如果比赛我早就打表了。#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;const int N=3原创 2017-03-03 20:52:37 · 214 阅读 · 0 评论 -
bzoj1003 物流运输 spfa+dp
Description 物流公司要把一批货物从码头A运到码头B。由于货物量比较大,需要n天才能运完。货物运输过程中一般要转 停好几个码头。物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格的管理和跟踪。由于各种 因素的存在,有的时候某个码头会无法装卸货物。这时候就必须修改运输路线,让货物能够按时到达目的地。但是 修改路线是一件十分麻烦的事情,会带来额外的成本。因此物流公司希望能原创 2017-02-24 22:35:02 · 227 阅读 · 0 评论 -
JZOJ3601. 【广州市选2014】Tree(tree)
Description下图展示了一种二叉树:这种二叉树的每个叶子节点上都标注了权值,而且具有以下有趣的特性:每个非叶子节点,其左右子树叶子节点的权值之和相等。我们称这种二叉树叫平衡二叉树。我们将一棵平衡二叉树叶子节点的权值从左到右列出来,假如这个权值序列是另一个序列A的子序列,我们称这棵平衡二叉树“隐藏”在序列A当中。在本题中,我们称一个序列S2是另一个序列S1的子序列,当且仅当S2可以由S1中删除原创 2017-02-25 15:54:26 · 269 阅读 · 0 评论 -
bzoj1625
裸背包。。#include<cstdio>#include<algorithm>#include<cstring>#include<math.h>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;int n,m;int f[100005];原创 2017-03-04 21:24:49 · 182 阅读 · 0 评论 -
bzoj1606
01背包,贡献=体积。。#include<cstdio>#include<algorithm>#include<cstring>#include<math.h>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;int n,m;int f[1原创 2017-03-04 21:32:21 · 176 阅读 · 0 评论 -
bzoj1618
分析:既然是不少于m,那么直接枚举到m+5000。。完全背包做一下就行了。#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;int n,m;原创 2017-03-05 08:45:32 · 173 阅读 · 0 评论 -
bzoj 1616
直接bfs的时候广搜就行了。。设f[i,j,k]表示走到i,j用了k时间。。 一万年没打过bfs的我表示,那个上下左右的常量都算错了。。RE了一次,1A率捉急啊。。#include<iostream> #include<cstdio> //#include<cmath> #include<algorithm> #include<cstring> #define fo(i,a,原创 2017-03-05 22:34:04 · 165 阅读 · 0 评论 -
bzoj1646
分析:一开始我觉得肯定dp,这不是很明显? 然而没想到怎么做,因为dp不知道按什么顺序。。反正这题绝逼有dp做法,等我想出来再写。。 大部分人写的都是bfs(smg),这根本一点都不明显好吗。唉,,反正bfs的相当暴力,,直接从起点开始跑,然后左右和*2加进队列,,知道能跑到终点为止。。注意左边界为0,右边界为max(n,k)+1..#include<cstdio>#include<algor原创 2017-03-09 17:00:31 · 224 阅读 · 0 评论 -
bzoj3404
分析:直接dp就好了,设f[i]表示i先手的输赢,由1-9可以推出来后面的,因为如果能从先手必赢变成先手必输,那么肯定可以转移。。当然也可以直接算出所有数的sg值。。#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<queue>#define fo(i,a,b) for(int i=a;i原创 2017-03-09 21:57:17 · 254 阅读 · 0 评论 -
bzoj1617
dp不解释。。#include<cstdio>#include<algorithm>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespace std;int n,m;const int N=1e5;int a[N],s[N原创 2017-03-06 21:48:11 · 228 阅读 · 0 评论 -
bzoj1633
分析:设f[i]表示覆盖前i个字符所需的最小代价。。表示dp太暴力我一开始居然在想线性的想了半天。。#include<cstdio>#include<algorithm>#include<cstring>#include<iostream>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i-原创 2017-03-07 16:07:08 · 176 阅读 · 0 评论 -
bzoj1643
分析:这题其实很水。。但是我一开始想岔了。。因为以前做过一类组合类型的题目,有一个姿势是这样的:x1+x2+..+xk=c,非负解的个数为=C(c+k-1,k-1) 那其实就很明显了。。问题是这只是非负解的个数,怎么算排列还是个问题。。现在一想好像挺好算?但是转换很麻烦。。 正解就是sb dp。。#include<cstdio>#include<algorithm>#include<cstr原创 2017-03-10 21:22:02 · 259 阅读 · 0 评论 -
bzoj4100
分析:一开始看到题目的我一脸蒙蔽。。看了一会儿才看懂。。 设f[i][j]表示i个字母取模7等于j的方案数,只要三个式子有一个等于0就加上答案。#include<cstdio>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)using namespace std;typedef long原创 2017-03-11 20:36:02 · 184 阅读 · 0 评论 -
bzoj4102
前言:最近很烦。。这种dp题目思路虽然比较巧妙,但我觉得还是比较裸的。尤其是这种折回来的sbn^2dp,没有想出来。感觉自己的dp一直很弱,但是没想到弱到这种程度。。下次dp题目无论如何,没有半个小时不要看题解。 分析:先预处理出任意两个点之间的距离,然后按照权值从小到大排序,最后做n^2dp就可以了,设f[j]=max(f[j],f[i]+a[j]-dis[i][j]),答案当然就是最大的f[i原创 2017-03-11 22:42:52 · 238 阅读 · 0 评论 -
51nod 1086
分析:瞎玩,直接裸多重背包,虽然多重背包有O(nm)的做法,但是懒得打。。#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fd(i,a,b) for(int i=a;i>=b;i--)using namespa原创 2017-03-29 09:23:55 · 236 阅读 · 0 评论