![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
DP
文章平均质量分 54
WeYoungg
这个作者很懒,什么都没留下…
展开
-
总结一类比较特别dp模型
hdu1421 poj2228hdu2577 这三个题目是最近做到的比较有特点的一类 由于某一些条件 比如取了一个东西 相邻的东西就会有所改变 那么一般会在朴素的转移方程上再加一维状态 0 1 代表对这一项不操作或者 操作 然后再从这个状态的意义出发推方程 会相对好做一些 hdu1421 搬寝室 经典DP模型 分析一下可以转化为 n个有序数字 取k个相邻的两个数字 代价是这两个数字原创 2016-11-29 21:47:01 · 1264 阅读 · 0 评论 -
poj1973
poj1973题目链接 题意是有n个人,有项目A和项目B,项目A和B总共有m个,它们分别相互独立.每个人完成一个项目A,B的时间分别是xi,yi.问完成m个A项目和m个B项目所需要的时间是多少. 我们很容易想要用二分时间,但是check函数并不好想,听有的dalao说用一种贪心的方法,先按b从小到大排序,如果相等则a从大到小排序.然后从后往前,也就是说让做b慢的先去把A做了,做到原创 2017-06-20 11:35:36 · 340 阅读 · 0 评论 -
斜率优化dp
hdu3045在做了几个入门的斜率dp题之后写这个题,其实这个题的方程跟之前的入门题hdu3507差不多 , dp[i] = min(dp[i] , dp[j] + (sum[i] - sum[j]) - (i-j) *(num[i+1]) ) ; {0 <= j <= i - T} 可以看出来其实基本上没什么不同,唯一有区别的是j的取值范围.0到i-T 这是我一开始写的版原创 2017-07-10 22:05:09 · 445 阅读 · 0 评论 -
高维前缀和
前几天补2016大连icpc现场赛的题目时,遇到了一个树分治,这个题除了套一个树分治的模板还要加上高维前缀和的东西。然后发现自己什么都不会….(只是一个铜牌题),补了一下相关的知识,先写一下高维前缀和吧。for(int i = 0; i< 3 ;++i){ for(int j = 0; j<8 ;++j) if( !(j&(1<<(i))) ) a[j] += a[j|(1原创 2017-08-10 20:24:26 · 2913 阅读 · 2 评论 -
hdu6078
多校第四场1012Wavel Sequence 题意是定义一种波浪数列,满足a1< a2 > a3 < a4 > a5 给两个数列a,b,选出a b的一个公共子串,且是一个波浪数列,问这样的方案有多少种。 这个题相当于公共子序列里再套一个dp 定义dp[i][j][k]为a串前i个且以b串j结尾且上升状态为k时的方案数,那么就可以枚举转移了。 dp[i原创 2017-08-05 21:18:48 · 715 阅读 · 0 评论 -
Codeforces Round #426 (Div. 2) D. The Bakery
题目链接 给一个序列,要求把序列划分成k段,每一段里的权值是这一段里不同数字的个数。求如何划分使得k个区间的权值和最大。 我们容易想到dp[i][j]代表前j个分为i段时的最大值 dp[i][j] = dp[i-1][k] + size(k+1 , j) ( 0<=k<j ) //size(a,b)表示a到b这个区间里有多少个不同数字但是这显然是个二维的方程,比赛时怎么都原创 2017-08-06 15:49:05 · 444 阅读 · 0 评论 -
Codeforces Round #427 (Div. 2) D.Palindromic characteristics
题目链接 题意是这样的:定义了一种k阶回文串,1-阶是普通的回文串,k-阶回文串的前半串和后半串必须是相等的(不是回文,例如abcabc,如果长度奇数中间的不管他)然后其前半串必须是k-1阶回文串,后半串必须是k-1阶回文串。 然后给一个串,问这个串有多少子串是i阶回文串(i从1到n,依次输出) 分析一下可以看出如果一个串是k阶回文串,那么他必然是k-1阶回文串,于是我原创 2017-08-06 16:34:23 · 312 阅读 · 0 评论 -
hdu6155
Subsequence Count题目链接 ccpc网络赛1006 题意是给一个01字符串,然后有2种操作, 1、把l到r这个区间的字符翻转, 2、查询l到r这个区间有多少个不同的子序列,(注意是子序列,可不连续),对1e9+7取模 这个题目在比赛的时候过的人很少 其实对于第二种操作,我们容易得到一个dp[i][0/1]代表前i个字符以0/1结尾的不同子序列有多少个,容易得到方程if(s原创 2017-08-21 19:43:28 · 1036 阅读 · 0 评论 -
hdu5534
Partial Tree题目链接 题意是有n个点,需要加边把他们连接成一棵树,然后每个点的点权的其度数对应的价值。然后问能够连接形成的树的最大权值。 抽象出来其实就是有n-1个物品,背包大小为 2*(n-1), 然后每个物品可以取多次,但是必须取出恰好n个东西出来,因为对应n个点。朴素的解法是我们直接多加一维状态去表示,但是很麻烦的是三维的dp显然没办法在这个题里面做。 有一个精妙的操作可以原创 2017-08-07 13:03:22 · 444 阅读 · 0 评论 -
HDU6161
Big binary tree多校1001 题目链接 题目是给一棵完全二叉树,从上到下从左到右给每个节点标号,每个点有权值,初始权值为其标号,然后有两种操作: 1、把u点权值改为x 2、查询所有经过u点的路径中,路径上的点权和最大。 节点有n个,修改有m个,n<=1e8 ,m<= 1e5 我们容易想到维护一个dp[u]代表从u点往下走能获得最大的权原创 2017-08-22 20:59:48 · 943 阅读 · 0 评论 -
hdu6170
HDU6170 Two strings题目链接 题意是给两个串,第一个串是只包括大小写字母的串,第二个串除了大小写字母还包含了 ” * ” “.” 。 “.”可以匹配任意字符 ,“ * ”可以让前面的字符出现任意次,包括0次。 问这两个串能不能匹配上。 这道题有很多种解法,用java正则或者模拟或者dp都行。 给出dp做法,dp[i][j][0/1/2]代表第一串前i个和第二原创 2017-08-22 21:20:37 · 507 阅读 · 0 评论 -
hdu6199
沈阳网络赛1006 gems gems gems 题意是有n堆宝石(可能有负数),A和B从左到右拿宝石,A先手拿1或者2堆,假设某个人当前拿了k堆,那么下一个人只能拿k或者k+1堆,如果他取不了k堆宝石时,游戏结束。定义difference为A拿到的宝石数减去B拿到的宝石数,A想要其值最大化,B想要其值最小化,假设A和B都用最好的策略,那么这个最终的difference最大可以多大。这个题目好像原创 2017-09-13 12:21:17 · 1071 阅读 · 2 评论 -
计蒜之道复赛 腾讯消消乐
腾讯消消乐 状压dp题目链接 题意是就点进去题目链说的那样. 看一下数据由于n<18 然后考虑用状压dp dp[i][s] 表示消去i次得到的状态为s的方案数,1代表删了0代表还没删,当我们枚举到一个状态s时,取出所有0位,然后枚举其中的一段,删除掉,即可转移到下一步的该状态, 例如1010101,即表示当前序列已经被删剩下3个,然后枚举这3个数字中的一段如 110,则当前状态可原创 2017-07-31 11:35:21 · 591 阅读 · 0 评论 -
Codeforces Round #436 (Div. 2)E.Fire
题目链接 题意是有一个人着火了,有n个物品,每个物品有一个价值p,有一个d代表必须在<d之前的时间里把这个东西救出来才有效,有一个t代表救该物品需要用的时间,问你说最后能够获得的最大价值是多少,同时按救援顺序输出救了哪些东西。 如果不考虑物品的deadline的话,我们就直接做一个背包记录一下路径即可,但是考虑到物品救援有先后顺序,我们发现如果两个物品的d一样的话,那么先后救哪原创 2017-09-26 12:27:23 · 357 阅读 · 0 评论 -
hdu6076
Security Check(多校第四场)题意是有两队人在排队等待安检,每个人有一个权值,每分钟可以检查一个人的,当两个人权值差的绝对值>k时,可以一分钟同时检查这两个人。问把所有人检查完所需要的最短时间。n<=60000,k<=10,Ai,Bi均是(1-n)的全排列。 如果这个n比较小我们容易得到一个f[i][j]表示检查完第一队前i个人,第二队前j个人所需要的最短时间。if |A[i] -原创 2017-10-11 12:29:30 · 379 阅读 · 0 评论 -
D. Kefa and Dishes
D. Kefa and Dishes题目链接 给一个序列ai,长度为n,每个ai对应一个价值,选出m个数字出来,同时给出K对关系(i,j,ck)表示当前如果取了第j个,而上次是取的第i个,那么还可以获得ck的价值,问最大能获得的价值。 m<=n<=18 看似一个图论,网络流之类的流来流去,但是数据范围较小,可以直接状压dp。 f[i][status][j]表示当前取了i个状态为status,原创 2018-01-12 16:17:45 · 457 阅读 · 0 评论 -
C. Square Subsets
C. Square Subsets题目链接 给一个序列ai,长度n,问有多少种方法可以选一些数字出来,且使得这些数字乘积是一个平方数。 n<=1e5 , ai<=70 任意一个平方数可以表示为p1^a1 * p2^a2 * ……其中p1表示质数,a1是一个偶数,且我们不关心具体是多少只需要知道是奇偶即可,那么可以直接用01来表示。 观察到ai比较小,我们直接把70以内的数字拆分成质因子表示形原创 2018-01-12 16:29:03 · 466 阅读 · 0 评论 -
美团点评A轮B题
合并回文子串题目链接 题意是给两个字符串,问合并之后可以得到的最长回文串有多长. 如dba abcd 合并后可以成为 dabcbad 最长回文串即为它本身. 求一串字符串的最长回文串的dp解法是dp[i][j]为1表示i到j为合法回文串,为0表示不合法,当(s[i] == s[j]&& dp[i+1][j-1]) dp[i][j] = 1, 空串的时候也是合法的.原创 2017-06-20 09:54:37 · 383 阅读 · 0 评论 -
hdu5900
2016沈阳网络赛题目链接 题意是一开始没搞清楚,给n对数字,然后每对数字有一个key 一个value,如果当两个连着的数字key不互质的话,那么这两个数字可以消去,同时可以获得这两个数字的value,而且消去后旁边两个数字也是连起来了,有点类似于消消乐. 搞懂题意后应该很明显可以看出是一个区间DP,但是太菜了方程不太好想. 可以先预处理一下i到j是否可以被消去原创 2017-06-18 14:16:45 · 340 阅读 · 0 评论 -
Codeforces Round #396 (Div. 2) C. Mahmoud and a Message
C. Mahmoud and a Messagetime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputMahmoud wrote a message s of lengt原创 2017-02-20 18:54:28 · 310 阅读 · 0 评论 -
Codeforces Beta Round #3 D. Least Cost Bracket Sequence
D. Least Cost Bracket Sequencetime limit per test1 secondmemory limit per test64 megabytesinputstandard inputoutputstandard outputThis is yet another problem on原创 2017-02-22 15:07:16 · 536 阅读 · 0 评论 -
cf448C
原题链接http://codeforces.com/contest/448/problem/C题意大概是有n列篱笆,每列宽度都为1,高度为hi,现在有一把刷子宽度为1,每次刷不能改变方向,要么横着刷要么竖着刷,可以刷任意长度,但是方向不能改变,问最少刷多少次能把篱笆刷完。仔细想一下,发现顶多刷n次就能够刷完,所以最多不会超过n次。而且如果某一列有横着刷的部分,那么下面都是横着刷的,(想一下原创 2017-02-01 14:26:56 · 502 阅读 · 0 评论 -
Codeforces Round #210 (Div. 1) B. Levko and Array(dp 思维)
B. Levko and Arraytime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputLevko has an array that consists of inte原创 2017-03-05 15:22:06 · 465 阅读 · 0 评论 -
Codeforces Round #106 (Div. 2) D. Coloring Brackets
D. Coloring Bracketstime limit per test2 secondsmemory limit per test256 megabytesinputstandard inputoutputstandard outputOnce Petya read a problem about a brac原创 2017-03-09 18:18:56 · 244 阅读 · 0 评论 -
hdu 4283 You Are the One
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4283题意是现在一场表演,有n个人排成一队要上台表演,由每个人有一个权值D[i],第i个人上场时总的答案要加上(i-1)*D[i];然后现在有一个栈供我们进行调整出场顺序,问如何调整使得答案最小,输出这个答案;我们分析一下可以看出来,如果可以随便调整的话,那么肯定就是把值从大到小放置原创 2017-03-11 12:15:20 · 241 阅读 · 0 评论 -
TSP问题(状压DP求解)
TSP问题即最短旅行商问题,在给定的带权无向图中求得一条最短的哈密顿路.这个问题我们在离散数学课上有讲过,是NPhard但是数据范围较小的时候我们还是可以通过一些算法求得近似解.白书上介绍了一种很经典的状压dp求解方法. dp[s][v],s表示一个点的集合,这个集合可以是DAG中所有点的子集,这里我们用s来代表所有已经到过的点,用dp[s][v](v∈s)代表从v点出发经过除s以外的所有点后原创 2017-03-13 12:41:56 · 2992 阅读 · 0 评论 -
武大校赛网络赛B题
B. Color链接:武大校赛网络赛B题 题意是给定一棵树然后每个节点可以染色,总共有m种颜色,给出一个01矩阵代表第i个点是否能染第j种颜色,然后问总共有多少种染色方法。 很明显的树形dp,可是比赛的时候没有时间去做,真的很可惜, dp[u][i]为第u个点染第i种颜色的方案数 dp[u][i] = dp[u][i] * ∑dp[v][j]原创 2017-04-10 15:42:55 · 456 阅读 · 0 评论 -
Codeforces Round #278 (Div. 1) B. Strip
题目链接:http://codeforces.com/problemset/problem/487/B题意是给一个数组,然后要求把这个数组分成几段,每一段最值差不超过S,每一段的区间长度不少于L,问最少能够分成多少段?如果无解输出-1.一开始观察一下发现每一段区间的最值差会随着长度的增加而增加,可以通过二分找到每个数字向左能延伸的最大范围,然后定义dp[i]为到第i个数字能够划分的原创 2017-03-26 13:15:02 · 370 阅读 · 0 评论 -
武大网络赛H题
WerewolfH.Werewolf 题意是:狼人杀,然后放逐投票的时候,每个人可以投一个对象,只有狼和好人之分,狼不能投狼,好人可以投好人也可以投狼,给出每个人投票的对象,问说最多能有多少头狼。 把n个人看成n个点,然后建图,最后的图肯定是一个由k个联通分块组成的,每个连通块里面是一棵树或者一棵树再加一条边。如果没有这条边我们直接树形dp就行了,但是我们可以先把这条边去掉,然后我们可以分两种情原创 2017-04-12 21:46:46 · 357 阅读 · 0 评论 -
ZOJ3956
Course Selection System题意是给出n对(Hi , Ci) 需要我们选出m对(m是我们自己选择的)使得 最大看到C[i]的数据范围,大概感觉就是需要枚举的。我们观察一下这个式子,发现当∑Ci一定的时候Hi越大越好,这样的话我们可以直接把题目转化成一个01背包问题去求解。当∑C[i]一定时,如何获得最大的∑Hi#include<cmath>#include<algorithm原创 2017-04-18 15:55:45 · 491 阅读 · 0 评论 -
武汉大学校赛总结 + E题+F题
E.Your NP has been charged full这次比赛好难看,除了抢了一个签到题的一血,又是跟去年差不多的难看。 感觉主要还是练的不够多,一个一眼dp题没有看出来,还有一个找规律题找了一整场,从开局2分钟抢一血到出第二个题隔了200分钟(Galigaygay) 总结起来就是:还是不够熟练啊!!! E题 题意是一个游戏有n个回合,每次给出一组数,每组数里面有3个数字,ai,bi原创 2017-04-19 19:57:58 · 566 阅读 · 0 评论 -
Codeforces Round #408 (Div. 2) E
E. Exam Cheating题目链接:E. Exam Cheating 题意是有个女同学要作弊,总共有n道题,旁白有两位学霸,但是他们分别完成了r道题和s道题(按题号严格递增)。这位同学要作弊总共能看p次,每次只能看一位同学的最多连续k道题,只有学霸完成了的题目才能看。问最多能看多少道题。感觉很巧妙的dp题,一开始我以两位学霸完成了题目为时间轴,但是后来发现有相互覆盖的情形。看了别人的状态后,原创 2017-05-05 15:39:43 · 467 阅读 · 2 评论 -
UESTC 我要长高
我要长高 (dp加优化)题目链接:我要长高题意是……就是题目描述的那样了吧 题意很显而易见,一眼dp题 dp[i][j]代表第i个人身高为j时的最小消耗, dp[i][j] = min (dp[i-1][k] + abs(j - k ) * C + (j - h[i])^2) 复杂度O(n * h[i]^2 ),很明显有点大,学习了一下单调队列优化dp之后,发现形如dp[i] = min/ma原创 2017-05-09 16:24:10 · 509 阅读 · 0 评论 -
计蒜之道2016第六场
题目链接:微软员工的福利(中等)题意是………………题面描述的那样…..中文题. 我只想到了中等的解法,就是对于一个点直接枚举他儿子和他自己的两个最值,然后树型dp,复杂度是O(n³),思路比较清晰但是写起代码来比较复杂,因为在枚举最大值最小值的时候要考虑到这个最值是不是该点他本身.#include<cmath>#include<algorithm>#include<cstring>#incl原创 2017-06-01 09:48:32 · 430 阅读 · 0 评论 -
Recovering BST
Codeforces Round #505 D. Recovering BST题目链接:http://codeforces.com/problemset/problem/1025/D题意:给定一个长度为n(&lt;= 700)的序列问是否能用这些数字构造出一颗二叉排序树,使得其每条边连接的两个点之间的gcd(最大公约数)>1做法:对序列排序,我们容易想到枚举每一条边判断是否合法,但是显...原创 2018-08-27 20:52:37 · 437 阅读 · 0 评论