
动态规划(DP)
flaaaaaaame
Hope is floating on the breeze.
展开
-
UVa1625 Color Length
题目描述 传送门参照刘汝佳书上的思路。一开始自己写了个记忆化搜索超时了,哪位高人能指点一下超时的原因…//TLE!#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;int l1,l2,b1[200],b2[200],e1[200],e2[200],d[501原创 2017-08-10 11:24:31 · 277 阅读 · 0 评论 -
LA3983 Robotruck
题目描述 蓝书上的例题,我重新推导一遍。 设d(i)d(i)表示捡完前ii个垃圾需要走的最短距离。 d(i)=min{d(j)+dist0(j+1)+dist(j+1,i)+dist0(i) | w(j+1,i)<=c}d(i)=min\{d(j)+dist0(j+1)+dist(j+1,i)+dist0(i)\ |\ w(j+1,i)<=c\} 其中: dist0(i)dist0(i)原创 2017-08-13 10:43:54 · 425 阅读 · 0 评论 -
BZOJ 1010 [HNOI2008]玩具装箱toy
题目描述 传送门 P教授要去看奥运,但是他舍不下他的玩具,于是他决定把所有的玩具运到北京。他使用自己的压缩器进行压缩,其可以将任意物品变成一堆,再放到一种特殊的一维容器中。P教授有编号为1…N的N件玩具,第i件玩具经过压缩后变成一维长度为Ci.为了方便整理,P教授要求在一个一维容器中的玩具编号是连续的。同时如果一个一维容器中有多个玩具,那么两件玩具之间要加入一个单位长度的填充物,形式地说如果将第i原创 2017-08-14 00:04:08 · 336 阅读 · 0 评论 -
Luogu P2679 [NOIp提高组2015]子串
题目描述 有两个仅包含小写英文字母的字符串 A 和 B。现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一 个新的字符串,请问有多少种方案可以使得这个新串与字符串 B 相等?注意:子串取出 的位置不同也认为是不同的方案。设d(i,j,k)d(i,j,k)表示字符串A前ii个字符取出kk个子串组成字符串B的前jj个字符的方案数原创 2017-08-14 13:43:30 · 413 阅读 · 0 评论 -
BZOJ 1096 [ZJOI2007]仓库建设
题目描述 传送门 L公司有N个工厂,由高到底分布在一座山上。如图所示,工厂1在山顶,工厂N在山脚。由于这座山处于高原内陆地区(干燥少雨),L公司一般把产品直接堆放在露天,以节省费用。突然有一天,L公司的总裁L先生接到气象部门的电话,被告知三天之后将有一场暴雨,于是L先生决定紧急在某些工厂建立一些仓库以免产品被淋坏。由于地形的不同,在不同工厂建立仓库的费用可能是不同的。第i个工厂目前已有成品Pi件,原创 2017-08-14 10:20:16 · 434 阅读 · 0 评论 -
BZOJ 1911 [APIO2010]特别行动队
题目描述 因为是从别人博客里斜率优化分类一栏找的题目,所以…这题被我秒了。显然先预处理前缀和s(i)=∑ik=1xis(i)=\sum_{k=1}^ix_i 设d(i)d(i)为将前ii个士兵分组的最大修正后战斗力。 d(i)===max{ d(j)+a(s(i)−s(j))2+b(s(i)−s(j))+c }max{ d(j)+a×s(i)2−2a×s(i)s(j)+a×s(j)2+b×s(原创 2017-08-14 19:42:48 · 367 阅读 · 0 评论 -
Luogu P1850 [NOIp提高组2016]换教室
题目描述 传送门作为蒟蒻的我不懂概率,不懂期望QWQ。看别人的题解裸地期望DP似懂非懂。先写一下吧,以后再做应该会更能理解的。代码#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;const int maxn=2010,maxv=305;int a[maxn]原创 2017-09-14 18:00:02 · 428 阅读 · 0 评论 -
LA3882 And Then There Was One
题目描述 传送门蓝书上的例题,递推法求之。 设f(n)f(n)为0~n-1个数字围成一圈,从0开始每k个删一次最后删的数。 f(n)=(f(n−1)+k)%nf(n)=(f(n-1)+k)\%n 最终答案是 (f[n]+m-k+1)%n 注意可能是负数,还要处理一下。代码#include<cstdio>#include<iostream>#include<cstring>#includ原创 2017-09-07 12:58:04 · 340 阅读 · 0 评论 -
UVa10635 Prince and Princess
题目描述 传送门求两序列的LCS,当序列元素两两互不相等可转化为LIS。 LIS可以用O(nlogn)O(nlogn)的算法求解。 (但我还是理解不透彻,总感觉在背模板…)代码#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=7原创 2017-09-07 13:24:14 · 337 阅读 · 0 评论 -
LA4256 Salesmen
题目描述 传送门很容易想到O(n2)O(n^2)暴力预处理在每个城市时小A和小B分别要到达的另一个城市和距离。再暴力O(nm)O(nm)求每一个询问。这样可以骗到70分。 预处理时可以用平衡树,具体操作是将每一座城市从西往东一个插入树,再寻找与它距离最近的,仔细想一下就知道怎么找了。因为是倒着插,所以树中的一定是此城市西边的。(平衡树可以用STL的set) 作为蒟蒻的我以前只知道倍增可以搞st表原创 2017-09-03 12:28:52 · 307 阅读 · 0 评论 -
UVa11552 Fewest Flops
题目描述 传送门DP,设d(i,j)d(i,j)为前ii段(kk个字母为1段)以字符jj结尾能得到的最少块数,可以发现把每段重排字符顺序时相同字符排在一起一定最好。代码#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cstdlib>using namespace std;bool原创 2017-09-03 13:12:32 · 308 阅读 · 0 评论 -
UVa10524 Wavio Sequence
题目描述 传送门最长上升子序列和最长下降子序列,O(nlogn)O(nlogn)算法理解的还不是很透彻。代码#include<cstdio>#include<iostream>#include<cstring>#include<cstdlib>using namespace std;int a[10010],b[10010],g[10010],f[10010],d1[10010],d2[1原创 2017-09-03 13:19:09 · 266 阅读 · 0 评论 -
Luogu P1941 [NOIp提高组2014]飞扬的小鸟
题目描述 传送门个人感觉70分的DP还是比较容易的。 设d(i,j)d(i,j)为在第ii列第jj高度需要的最少点击数,无法到达为INFINF. 其实满分做法也不算难,完全背包+01背包,都是比较基础的东西,就是有坑点。 其实坑点细心一点就行了,但是我脑子抽了,导致调了好久(超级久QWQ)。 错误的地方代码里有注释。代码#include<cstdio>#include<iostream>原创 2017-09-12 13:02:27 · 458 阅读 · 0 评论 -
Tyvj P4869 罪犯分组
题目描述 传送门一看完题就觉得是状压DP。 DP方程不难想:设d(S)d(S)为集合SS需要的最小分组数。 那么 d(S)=min{ d(S−S0)+1 | S0⫋S,S0集合可分成1组 }d(S)=min\{\ d(S-S_0)+1\ |\ S_0\subsetneqq S,S_0集合可分成1组\ \} 要枚举全集的所有子集的所有子集,时间复杂度是多少呢?答案是O(3n)O(3^n)( 结原创 2017-09-22 13:09:25 · 367 阅读 · 0 评论 -
BZOJ 1026 [SCOI2009]windy数
题目描述 传送门原来这就是数位DP,原来做过一道类似的。 主要思路就是设d(i,j)d(i,j)为最高位为ii有jj位有多少个windy数,最后计算答案时要注意细节。 我的好像和大多数人的点不一样,似乎写麻烦了…代码#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace s原创 2017-10-02 10:16:38 · 322 阅读 · 0 评论 -
UVa11825 Hackers' Crackdown
题目描述 传送门简单的状态压缩DP。代码#include<cstdio>#include<iostream>#include<algorithm>#include<cstring>using namespace std;const int maxn=18;int d[1<<maxn],p[maxn],S1[1<<maxn];int main(){ int n,kase=0;原创 2017-10-20 09:15:37 · 353 阅读 · 0 评论 -
UVa 10859 Placing Lampposts
题目描述 传送门根据蓝书的思路: 设d(i,j)d(i,j)为以ii为根节点的子树,ii的父节点是否放灯(jj=0,1分别为放和不放)的最小方案数。 因为在放置街灯aa相等的情况下还有第二个比较条件,把条件统一为恰好被一盏灯照亮的边数c尽量小。设一个适当的数M,转换为最优化x=Ma+cx=Ma+c,M的选取要使在a1<a2a_1<a_2的情况下x1=Ma1+c1x_1=Ma_1+c_1一定小于x原创 2017-10-20 10:57:11 · 342 阅读 · 0 评论 -
UVa10285 Longest Run on a Snowboard
题目描述 DP 代码#include<cstdio>#include<iostream>#include<algorithm>#include<string>#include<cstring>using namespace std; string s;int n,m,t,d[110][110],a[110][110];int dp(int i,int j){ int原创 2017-08-12 21:47:55 · 292 阅读 · 0 评论 -
Luogu P1282 多米诺骨牌
题目描述 传送门 多米诺骨牌有上下2个方块组成,每个方块中有1~6个点。现有排成行的上方块中点数之和记为S1,下方块中点数之和记为S2,它们的差为|S1-S2|。例如在图8-1中,S1=6+1+1+1=9,S2=1+5+3+2=11,|S1-S2|=2。每个多米诺骨牌可以旋转180°,使得上下两个方块互换位置。 编程用最少的旋转次数使多米诺骨牌上下2行点数之差达到最小。 对于图中的例子,只要原创 2017-08-19 19:42:18 · 614 阅读 · 0 评论 -
UVa12186 Another Crisis
题目描述 设d(u)d(u)表示u给上级发信最少需要多少个工人写。 则d(u)d(u)等于u的从小到大前几个满足TT%的子节点的d值之和。 代码#include<cstdio>#include<iostream>#include<cstring>#include<vector>#include<algorithm>using namespace std;int n,t;vecto原创 2017-07-31 21:18:09 · 362 阅读 · 0 评论 -
UVa1220 Party at Hali_Bula
题目描述 树上最大独立集,解的唯一性。#include<cstdio>#include<iostream>#include<cstring>#include<vector>#include<algorithm>#include<map>#include<string>using namespace std;const int maxn=210;int n,d[maxn][2];原创 2017-07-31 21:13:29 · 306 阅读 · 0 评论 -
Luogu P1373 小a和uim之大逃离
题目描述:传送门 一看这题首先想到设d(i,j,k1,k2,0)d(i,j,k1,k2,0)表示在小a刚吸完i,j这个位置的魔液,小a和uim的魔瓶的魔液量分别为k1,k2时的方案数,d(i,j,k1,k2,1)d(i,j,k1,k2,1)表示在uim刚吸完……的方案数。 但是这样明显会爆内存…于是我就一直卡着了。后来看到讨论区有差这个字,才想到把状态减少到d(i,j,k,0)d(i,j,k,0原创 2017-08-02 21:24:23 · 561 阅读 · 0 评论 -
UVa1218 Perfect Service
题目描述 树形dp题。 设:d(i,k)d(i,k)表示以i为子树满足题意的需要最少服务器数量。 且: d(i,0)d(i,0)表示i和i的父亲节点都不装服务器; d(i,1)d(i,1)表示i的父亲装了但i不装; d(i,2)d(i,2)表示i节点装服务器。 则: d(i,0)=min(∑kϵson(i)d(k,0)+d(j,2)|k≠j)d(i,0)=min(\sum_{k\原创 2017-07-31 20:49:29 · 303 阅读 · 0 评论 -
UVa1626 Brackets sequence
题目描述 设f(i,j)f(i,j)为将区间i~j变成正规括号序列需要加的最少括号数。 f(i,j)=min(f(i,k)+f(k+1,j))f(i,j)=min(f(i,k)+f(k+1,j)) 当s[i]和s[j]是一对括号时,还可以作如下转移: f(i,j)=min(f(i,j),f(i+1,j−1))f(i,j)=min(f(i,j),f(i+1,j-1)) 边界为f(i,i)f原创 2017-07-31 08:33:16 · 325 阅读 · 0 评论 -
UVa10003 Cutting Sticks
题目描述 也是比较简单的dp 设f(l,r)f(l,r)为切l~r段的最小花费. f(l,r)=min(f(l,k)+f(k,r))+r−lf(l,r)=min(f(l,k)+f(k,r))+r-l(l<k<r)(l<k<r) 其中k为可切的点。 边界是f(l,r)=0(区间[l,r]内没有可切的点)f(l,r)=0(区间[l,r]内没有可切的点) 答案是f(0,L)f(0,L) 状态有原创 2017-07-31 08:22:39 · 318 阅读 · 0 评论 -
UVa11584 Partitioning by Palindromes
题目描述 求最少能划成多少个回文串,比较简单。 设f(i)f(i)为前i个字符组成的串最少能划分成多少个。 f(i)=min(f(j)+1)f(i)=min(f(j)+1) (j+1~i是回文串) 如果临时判断回文串要O(n)O(n)的时间。 总时间复杂度O(n3)O(n^3) 用O(n2)O(n^2)的时间预处理后可降为O(1)O(1) 总时间复杂度降为O(n2)O(n^2) 代码原创 2017-07-31 08:21:10 · 290 阅读 · 0 评论 -
UVa1025 A Spy in the Metro
第一道DP题….(以前做dp都是看题解,,,) 第一次独立做很不熟练,很多细节错误。题目描述 Secret agent Maria was sent to Algorithms City to carry out an especially dangerous mission. After several thrilling events we nd her in the rst stat原创 2017-07-28 20:58:51 · 388 阅读 · 0 评论 -
UVa437 The Tower of Babylon
题目描述 Perhaps you have heard of the legend of the Tower of Babylon. Nowadays many details of this tale have been forgotten. So now, in line with the educational nature of this contest, we will tell you原创 2017-07-28 20:58:12 · 383 阅读 · 0 评论 -
UVa1347 Tour
题目描述 这道题我想了很久都没有想到…….看了lrj的题解才会做。 首先可以想到转化成两个人向右走。 关键在于状态的设计。 设f(i,j)f(i,j)为走完了前max(i,j)max(i,j)的点,且两个人分别在i、j的位置,且i>ji>j,最少还要走多远才能到终点。 f(i,j)=min(f(i+1,j)+dist(i,i+1),f(i+1,i)+dist(j,i+1))f(i,j)=m原创 2017-07-28 20:57:44 · 445 阅读 · 0 评论 -
Uva116 Unidirectional TSP
题目描述 这是一道简单的DP题,记录路径可以用一个p数组; 设f(i,j)f(i,j)为从格子i,j出发到最右端的最小数字和。 边界是f(n−1,j)=a(n−1,j)f(n-1,j)=a(n-1,j) 我的程序n和m是反的,,,#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include原创 2017-07-28 20:57:19 · 420 阅读 · 0 评论 -
UVa12563 Jin Ge Jin Qu hao
题目描述 01背包问题,要求在装的多的情况下尽可能满。 滚动数组压缩空间。#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cstdlib>#include<cmath> using namespace std;const int maxt=50*180+678+10;原创 2017-07-28 20:56:46 · 274 阅读 · 0 评论 -
UVa11400 Lighting System Design
题目描述 说实话我觉得这题的状态转移方程并不好想(准确说我最后也没想出来,看了lrj的题解,也许是我太菜) 首先每种灯要么不换要么全换是一个要点。 那么将灯按照电压v排好序。 设d(i)d(i)为前i种灯的最优方案。 则:d(i)=min(d(j)+(s(i)−s(j))∗c(i)+k(i))d(i)=min(d(j)+(s(i)-s(j))*c(i)+k(i)) 表示前j个先用最优原创 2017-07-28 20:56:15 · 389 阅读 · 0 评论 -
UVa10817 Headmaster's Headache
题目描述 参照紫书上的思路,一开始d值初始化为0 TLE 了…… 代码#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<string>#include<sstream>using namespace std;int s,m,n,d[125][265][265],c[140],原创 2017-08-11 23:25:30 · 268 阅读 · 0 评论 -
UVa10618 Tango Tango Insurrection
题目描述 紫书上的例题,一开始不知道为什么要加上一个移动的脚的维度。 突然发现自己语文&英语阅读能力巨差,看了n久题目才看懂,,,,, 设d(i,a,b,s)d(i,a,b,s)表示已经踩了ii个箭头,左右脚分别在aa,bb上,上一次移动的脚为ss 转移过程详见代码。 代码(写的有点烂)#include<cstdio>#include<iostream>#include<cstring原创 2017-08-12 13:44:08 · 342 阅读 · 0 评论 -
UVa1629 Cake Slicing
题目描述 设d(r,c,i,j)d(r,c,i,j)为以r,cr,c为左上角,长宽分别为i,ji,j的矩形还需要最少切割长度。 则在它内部切一刀可转移到其他两块矩形(切后两块矩形内至少要有一个樱桃) 边界是当矩形内部只有一个樱桃时d(r,c,i,j)d(r,c,i,j)=1; 先预处理出每一块矩形内部有几个樱桃。 代码#include<cstdio>#include<iostream>原创 2017-08-12 16:52:36 · 449 阅读 · 0 评论 -
LA 2038 Strategic game
题目描述 传送门注意此题蓝书上的翻译有误! 蓝书上说“使得每个没有选中的节点至少和一个以选中的节点相邻”,而题目要求的是使得每条边至少和一个以选中的节点相邻。 搞得我硬是找不出错。 简单的树上DP,设d(i,0),d(i,1)d(i,0),d(i,1)分别为以ii为根节点的子树ii点不放兵和放兵总共所需的最小放兵数量,转移简单。代码#include<cstdio>#include<iostr原创 2017-10-20 15:22:47 · 380 阅读 · 1 评论