
动态规划
Lifel
dcoi 蒟蒻一枚 欢迎交流~~~qq:1627767186
展开
-
vijos 1057 盖房子
描述永恒の灵魂最近得到了面积为n*m的一大块土地(高兴ING^_^),他想在这块土地上建造一所房子,这个房子必须是正方形的。 但是,这块土地并非十全十美,上面有很多不平坦的地方(也可以叫瑕疵)。这些瑕疵十分恶心,以至于根本不能在上面盖一砖一瓦。 他希望找到一块最大的正方形无瑕疵土地来盖房子。 不过,这并不是什么难题,永恒の灵魂在10分钟内就轻松解决了这个问题。 现在,您也来试试吧。 格式输原创 2017-03-01 13:51:32 · 586 阅读 · 0 评论 -
bzoj 1600
f[i][j]表示前i份用j的方案数,成立条件是任意三边之和都大于第四边#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fod(i,a,b) for(int i=a;i>=b原创 2017-08-22 22:10:49 · 293 阅读 · 0 评论 -
Atcoder Shik and Game
题目大意数据范围思路题目大意:在[0, E]的数轴上,你从0出发,单位时间里你可以移动至多1单位距离。数轴上有n只熊,当你遇到一只熊后,从此时起再过T单位时间它身上会掉下一个金币。求从0出发捡到所有金币并走到E的最短时间数据范围1≤N≤100,0001≤T,E≤1090<xi<Exi<xi+1for1≤i<N1≤N≤100,000\\1≤T,E≤10^9\\0<xi<E\\xi<xi+1原创 2017-08-22 21:09:35 · 506 阅读 · 0 评论 -
poj 3093
Poj3093 (背包)题目大意:有V件物品,每件物品有大小,有一个大小为D的背包,求极大背包方案数 思路:枚举剩下的物品是什么,小于它的一定会选择,大于的做背包 一个优化:从大到小枚举#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#define fo(i,a,b原创 2017-08-22 16:46:51 · 419 阅读 · 0 评论 -
Gym - 101137K kruscal中的dp
题目大意:有一张n个点m条边的无向图。占领第i个点需要ai个人,在第i个点空降一个人需要bi的花费。占领第i条边需要ci个人,当占领某条边后,人便可以在边上自由行走。求占领所有点的最小花费。 1<=n,m<=3e51<=ai,bi<=1e60<=ci<=1e61 <= n, m <= 3e5\\ 1 <= ai, bi <= 1e6\\ 0 <= ci <= 1e6 思路:我们会做两种决策:选择原创 2017-08-25 08:22:20 · 460 阅读 · 0 评论 -
P1730 Floyed 最小密度路径
题目大意:给出一张有N个点M条边的加权有向无环图,接下来有Q个询问,每个询问包括2个节点X和Y,要求算出从X到Y的一条路径,使得密度最小(密度的定义为,路径上边的权值和除以边的数量)。分析: 数据范围不大,询问比较多,考虑用dp直接算出所有点对的答案.因为 密度=val/R所以考虑f[x][y][R] 为x=>y 经过R条边的最小值 ,ans=f[x][y][R]/R 状态转移为: f[i原创 2017-07-20 08:00:16 · 644 阅读 · 0 评论 -
UVa 免费糖果(记忆化搜索)
在状态复杂,信息多且数据小的情况下可以选择考虑记忆化搜索.这题我就做的很zz,一开始已知想打一个dp, 不过太麻烦了.看了解题报告之后才发现记忆化搜索这么简单#include<iostream>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fod(i,a,b) for(int i=a;i>=b;i--)原创 2017-06-06 16:10:20 · 355 阅读 · 0 评论 -
UVa 10934 (主要是思路)
描述:你有一栋n层的大楼和k个球,询问至少需要多少次确定球的硬度 分析:对于球的硬度,即是在高度为i时,球没碎掉,而在高度为i+1时,球碎掉了,此时便可以确定球的硬度为i. 主要是对于题目的理解:最坏情况是在最后一层但你不知道 约束在于球的个数有限制 完了分类:能否破掉进行转移Code:#include<iostream>#include<cstdio>#include<cm原创 2017-05-22 11:40:55 · 619 阅读 · 0 评论 -
UVa 10817 状压+记忆化搜索
描述: m个教师,n个求职者,s门课程.每门课程至少需要2个老师教,问符合要求的最小值 分析: 首先定义状态:对于每一个老师只有教或者不叫两种决策,而方程想要转移,很容易看出需要知道此时老师教授的情况.故:定义:f[i][s1][s2] i表示依考虑到前i个老师 s1为一个老师教的集合 s2为两个老师教的集合 f[i][s1][s2]=min(f[i+1][s1`][s2`],f原创 2017-05-09 19:35:34 · 316 阅读 · 0 评论 -
bzoj1725: [Usaco2006 Nov]Corn Fields牧场的安排 状压dp
题目大意:没有放置限制和左上,右上,左下,右下限制的bzoj1087 [SCOI2005]互不侵犯King 做法同, 先预处理合法的状态,然后转移 PS:枚举当前这一层和上一层状态的顺序是不重要的(即j,kj,k),因为无论什么顺序,上一层的答案都全部被处理出来了#include<iostream>#include<cstdio>#include<cmath>#include<cstri原创 2017-09-13 09:31:07 · 454 阅读 · 0 评论 -
bzoj1231[Usaco2008 Nov]mixup2 混乱的奶牛 状压dp
题目大意:给定一个长度为n的序列,询问任意相差都大于给定k的排列的数量一开始做的时候看错题了,以为只要任意有一个就要计算方案数,设计了一个状态 fi,j,k,lf_{i,j,k,l} i表示当前算了i个,j表示当前压缩的状态,k表示当前结尾,l表示此时为混乱或混乱Orz 正确的只有fi,jf_{i,j}i表示结尾,j表示状态,不需要第几个的原因是枚举的状态是递增的,求计算当前状态是基于已经计算好原创 2017-09-13 10:50:34 · 428 阅读 · 0 评论 -
bzoj1072[SCOI2007]排列perm
题目大意: 给定n个数字,求这些数字组成的不重复的全排列中有多少整除d 暴力:用next_permutation+set判重暴力判断(据说是可以过的)大常数选手又T掉了#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<set>#define fo(原创 2017-09-12 20:53:26 · 331 阅读 · 0 评论 -
bzoj1131 树形dp
闲着无聊做水题2#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fod(i,a,b) for(int i=a;i>=b;i--)using namespace std;c原创 2017-09-08 22:04:40 · 380 阅读 · 0 评论 -
bzoj3631: [JLOI2014]松鼠的新家 树链剖分||树形dp
题目大意: 每次对一条链进行区间修改,最后询问每个点的点权树剖裸题,似乎dfs序也可以做?有时间再补#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fod(i,a,b) f原创 2017-09-13 21:24:57 · 539 阅读 · 0 评论 -
【bzoj1827】[Usaco2010 Mar]gather 奶牛大集会 树形dp+贪心
由x转移到y的答案为ans=ans+val∗(s[1]−s[y]∗2)ans=ans+val*(s[1]-s[y]*2) 可以看出只有s[1]−s[y]∗2<0s[1]-s[y]*2<0答案才会减小,所以贪心即可#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#inc原创 2017-09-13 20:13:22 · 511 阅读 · 0 评论 -
bzoj4145 [AMPPZ2014]The Prices 状压dp
题目大意:你要购买m种物品各一件,一共有n家商店,你到第i家商店的路费为d[i],在第i家商店购买第j种物品的费用为c[i][j],求最小总费用。 1<=n<=100,1<=m<=16,1<=d,c<=1e61 <= n <= 100, 1 <= m <= 16, 1 <= d, c <= 1e6 思路:f[i][j]为到i处现在购买的状态.很容易想到的一种是枚举上一个状态和现在的状态,然后转移原创 2017-08-24 10:48:33 · 385 阅读 · 0 评论 -
bzoj1688: [Usaco2005 Open]Disease Manangement 疾病管理 状压dp
题意:给定n个集合,询问能够组成一种特定集合所能选的最大个数 很水的题,注意循环顺序(我一开始写反了)#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fod(i,a,b)原创 2017-09-13 16:52:55 · 451 阅读 · 0 评论 -
bzoj2073: [POI2004]PRZ 状压dp
想一下最优子结构,要解决一个集合,那么它的真子集一定是最优的,所以枚举子集,由子集转移过来3163^{16}.预处理,每个子集的时间和重量. PS:本来维护集合想用类似树状数组的方法 ,但时间不具有区间可加性#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#defin原创 2017-09-13 16:01:18 · 462 阅读 · 0 评论 -
bzoj2046分裂
只可会意,不能言传的一道题 注意:枚举状态从1开始而不是0,因为sum0=0sum_{0}=0会影响答案#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fod(i,a,b)原创 2017-09-13 14:40:50 · 450 阅读 · 0 评论 -
hdu 2196
算是对这篇的补充吧,讲解也在这~~摸我 再提一下:找出树的直径,然后分别从两个端点更新dis,最后取maxCode:#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<cstdlib>#include<vector>#define fo(i,a原创 2017-05-08 21:40:08 · 434 阅读 · 0 评论 -
UVA 12186 树上dp入门
这题实在没有什么好说的,除了需要知道儿子这个信息,什么都不需要.状态设计也很简单 直接上代码:Code:#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<cstdlib>#include<vector>#define fo(i,a,b) fo原创 2017-05-08 20:59:27 · 330 阅读 · 0 评论 -
codevs 2596 状丫!
题目描述 Description 某乡有n个村庄(n<=15),有一个售货员,他要到各个村庄去售货,各村庄之间的路程s(s<1000)是已知的,且A村到B村与B村到A村的路大多不同。为了提高效率,他从商店出发到每个村庄一次,然后返回商店所在的村,假设商店所在的村庄为1,他不知道选择什么样的路线才能使所走的路程最短。请你帮他选择一条最短的路。 Input Description原创 2017-03-26 17:29:19 · 493 阅读 · 0 评论 -
vijos 1071 01背包
描述过年的时候,大人们最喜欢的活动,就是打牌了。xiaomengxian不会打牌,只好坐在一边看着。 这天,正当一群人打牌打得起劲的时候,突然有人喊道:“这副牌少了几张!”众人一数,果然是少了。于是这副牌的主人得意地说:“这是一幅特制的牌,我知道整副牌每一张的重量。只要我们称一下剩下的牌的总重量,就能知道少了哪些牌了。”大家都觉得这个办法不错,于是称出剩下的牌的总重量,开始计算少了哪些牌。由于数据原创 2017-03-12 09:00:17 · 345 阅读 · 0 评论 -
vijos 4-Hanoi-Tower
描述“汉诺塔”,是一个众所周知的古老游戏。现在我们把问题稍微改变一下:如果一共有4根柱子, 而不是3根,那么至少需要移动盘子多少次,才能把所有的盘子从第1根柱子移动到第4根柱子上呢? 为了编程方便,您只需要输出这个结果mod 10000的值。 格式输入格式一个正整数n。(<=50000) 输出格式一个正整数,表示把n个盘子从第1根柱子移动到第4根柱子需要的最少移动次数mod 10000的值。原创 2017-03-12 10:29:01 · 654 阅读 · 0 评论 -
由vijos1067 联想到的矩阵乘法
最近做动态规划时,遇到了一道题,需要矩阵乘法,这里总结一下. 首先, 即对于C矩阵来说,c[i][j]=A矩阵[i]行与B矩阵[j]列的乘积之和,Code:matrix operator *(matrix a,matrix b){ matrix c; c.init(a.n,b.m); fo(i,1,c.n) fo(j,1,c.m)原创 2017-03-07 17:37:51 · 396 阅读 · 0 评论 -
vijos 1059 积木城堡 01背包记录方案
描述XC的儿子小XC最喜欢玩的游戏用积木垒漂亮的城堡。城堡是用一些立方体的积木垒成的,城堡的每一层是一块积木。小XC是一个比他爸爸XC还聪明的孩子,他发现垒城堡的时候,如果下面的积木比上面的积木大,那么城堡便不容易倒。所以他在垒城堡的时候总是遵循这样的规则。 小XC想把自己垒的城堡送给幼儿园里漂亮的女孩子们,这样可以增加他的好感度。为了公平起见,他决定把送给每个女孩子一样高的城堡,这样可以避免女孩原创 2017-03-06 15:32:35 · 1277 阅读 · 0 评论 -
vijos 1061 迎春舞会之三人组舞
背景HNSDFZ的同学们为了庆祝春节,准备排练一场舞 描述n个人选出3*m人,排成m组,每组3人。 站的队形——较矮的2个人站两侧,最高的站中间。 从对称学角度来欣赏,左右两个人的身高越接近,则这一组的“残疾程度”越低。 计算公式为 h=(a-b)^2 (a、b为较矮的2人的身高) 那么问题来了。 现在候选人有n个人,要从他们当中选出3*m个人排舞蹈,要求总体的“残疾程度”最低。 格式原创 2017-03-02 13:57:36 · 642 阅读 · 0 评论 -
王知昆论文的应用一 ------考试题目
B 题 问题描述: 小 A 是一名 UESTC 的学生,某天他在科研楼内无聊地望着楼下的停车场。从上方看 UESTC 的停车场就像一个 n * m 的矩阵,某些位置已经停了车辆,某些位置是空的。现在正是早晨, 陆陆续续有车驶入停车场并且停在了某个位置。小 A 开始记录这些车辆,并且在有一辆车 进入停车场后,他想知道现在停车场内最大的一个不含任何一辆车的正方形的边长是多少。 现在小 A 把原创 2017-03-01 13:58:18 · 523 阅读 · 0 评论 -
codevs 2594 解药还是毒药 状压dp
题目描述 Description Smart研制出对付各种症状的解药,可是他一个不小心,每种药都小小地配错了一点原料,所以这些药都有可能在治愈某些病症的同时又使人患上某些别的病症(你可能会问那…那是解药还是毒药啊?)……,经过Smart的努力,终于弄清了每种药的具体性能,他会把每种药能治愈的病症和能使人患上的病症列一张清单给你,然后你要根据这张清单找出能治愈所有病症的最少药剂组合……顺便说一声原创 2017-03-27 11:27:09 · 539 阅读 · 0 评论 -
树上dp的基本东西
这是紫书P280~P282的读书笔记树的最大独立集 概念:在一个无根树中选出一些互不相邻的点,使这个集合最大 定义:d[i]为以i为根的子树中最大独立集的值,s[i]表示i的儿子,gs[i]表示孙子 方程:对于i点只有两种状态选或者不选,可以看成一个01背包问题,转移只有两种: d[i]=max(1+sum(d[j1]),sum(d[j2]));j1∈gs[i],j2∈s[i原创 2017-05-08 16:54:55 · 1423 阅读 · 1 评论 -
UVA 12563 01背包
01背包题目,我们采用滚动数组优化; 对于第二个答案有个限制即n最大所以第二次逆序枚举而且取max时求得 PS:~~我是不会说初始化要为负的Code:#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#define fo(i,a,b) for(int i=a;i<=b;i++)#define f原创 2017-04-24 16:14:50 · 475 阅读 · 0 评论 -
LIS 百练2757 LCS UVA10405
没想到我现在已经水到了这种程度#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<cstdlib>#include<queue>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fod(i,a,b) fo原创 2017-04-25 14:09:09 · 334 阅读 · 0 评论 -
UVA 11400 01背包
一些碎碎念: 题意还真难懂orz,指的是一开始每种都需要买,然后我们可以发现一个性质:电压小的可以换成电压大的(合法),所以其实就变成了一个01背包问题(决定每次换还是不换) 感觉我在水的道路上渐行渐远 ~O(∩_∩)O~Code:#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#includ原创 2017-04-25 21:39:15 · 294 阅读 · 0 评论 -
uva 1252
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<cstdlib>#include<vector>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fod(i,a,b) for(int i=a;i>=b;原创 2017-05-10 12:18:45 · 421 阅读 · 0 评论 -
UVA116
继续颓废中…….#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#include<cstdlib>#include<queue>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fod(i,a,b) for(int i原创 2017-04-24 12:39:51 · 369 阅读 · 0 评论 -
UVA 11584 划分回文串
4月事情有点多,没怎么写,这个月要抓紧了.思路: 用动态规划判断会问串:d[i][j] 代表从位置j开始的长度为i的是否为回文串; 容易得到 if(ck[i-2][j+1]&&c[j]==c[j+i-1]) ck[i][j]=1; 注意要先算所有同一长度的 所以 for(int i=3;i<=n;++i) for(int j=1;j<=n-i+1原创 2017-05-03 16:26:49 · 384 阅读 · 0 评论 -
nyoj 16 嵌套矩阵(DAG图)
经典的嵌套矩阵问题加路径输出 将矩阵间能否嵌套转化成一个DAG图上的最长路问题 对于最长路径的打印: 若只需要字典序最小很简单 对于打印所有,采用递归实现(有点类似全排列的实现)不知道正确性,有没有神犇说一下orzCode:#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#inclu原创 2017-04-13 13:43:53 · 461 阅读 · 0 评论 -
bzoj1087 [SCOI2005]互不侵犯King
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fod(i,a,b) for(int i=a;i>=b;i--)using namespace std;const int原创 2017-09-12 22:32:37 · 439 阅读 · 1 评论