动态规划
Little_Flower_0
一只小花
展开
-
Codevs1014 装箱问题
题目大意: n个物品中,任取若干个装入箱内,使箱子的剩余空间为最小。思路: 占用空间和价值相等的01背包问题,j代表占用体积,则有 f[j]=max(f[j],f[j-c[i]]+c[i]),前者表示不选c[i]的情况,后者表示选c[i]的情况,j从v降至c[i],枚举每个c[i]。代码如下:#include<cstdio>#include<cstring>int v,n,c[2000原创 2015-06-25 17:24:59 · 480 阅读 · 0 评论 -
Vijos1347 乘积最大
题目大意:给定数n、k,求在数n中插入k个乘号所能取得的最大值。思路:记f[i][k]表示前i个字符插入k个乘号能取得的最大值,则有f[i][k]=max{f[j][k-1]*num[j][i]},num[j][i]表示从j到i的字符组成的数的值,初始化f[i][0]=num[1][i],目标f[n][k]。代码如下:#include<iostream>#include<cstdio>#i原创 2015-10-21 14:37:57 · 614 阅读 · 0 评论 -
Vijos1118 统计单词个数
题目大意:给定一个长度20*p的字符串以及一个字典,求将该字符串分成k份后最多能包含多少个字典中的单词(某个字母不能同时作为多个单词的开头)。思路:划分型DP。先预处理出在各个区间中包含的单词数,这里可以只记录最短单词的长度,因为一个字母只能提供一个开头。接下来就有f[i][k]=max(f[i][k],f[j][k-1]+cnt[j+1][i]),其中f[i][k]表示将前i个字符插入k个隔板(原创 2015-10-25 21:31:03 · 538 阅读 · 0 评论 -
Vijos1313 金明的预算方案
题目大意:给定物品数与总钱数,物品分为主件与附件,想选附件必须选主件,求最大能得到多少给定价值。思路:绝对是有依赖的背包问题,可将其转化为01背包问题。对于每一个物品集合,取不选、只选主件、多选一个附件、多选两个附件的最大值即可。要注意的一点是,要预处理将属于同一个集合的物品(即主件及其附件)归到一起。代码如下:#include<iostream>#include<cstdio>#incl原创 2015-09-22 21:50:19 · 846 阅读 · 0 评论 -
UVa481 What Goes Up
题目大意:求LIS,同时输出该序列。思路:发现了一个叫lower_bound( )的函数,直接用它二分即可。不过要输出序列,需要记录各元素在二分中的序列中的位置(即以该元素为尾的LIS长度)。然后从后往前找一遍,第一个出现的代表某长度的元素即为序列中的元素(因为该元素最晚被更新),输出即可。代码如下:#include<iostream>#include<cstdio>#include<cs原创 2015-10-12 15:57:16 · 491 阅读 · 0 评论 -
BestCoder Round #59 (div.2)
前言: 受水平限制,仅能在比赛及其结束后写出前三题。题目:SDOI思路:就是纯模拟,只不过略为恶心。代码如下:#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=105;struct node{ string原创 2015-10-13 07:34:17 · 368 阅读 · 0 评论 -
Codevs2880 送外卖
题目大意:给定一张图,有0至n(n<=15)这些点,两两之间均有通路,求从0开始经过所有点(可以重复)再回到0的最小花费。思路:n挺小,但dfs还是会超时,正解是floyd+状压DP。首先需要面对的一个问题是如何表示访问过哪些点,没访问过哪些点,这可以用二进制的思想解决。即利用某个数的二进制表示中某一位的0或1来表示该点是否存在于集合中,例如,一共n+1个点,如果都在集合中,则可以表示为1<<(原创 2015-10-15 15:41:10 · 587 阅读 · 0 评论 -
Codevs1648 最大和
直接看这个就行了,没法再详细了……最大连续子序列和的6种思考方法再说一句,其实环是不用管的,因为假如一个环是从1到i,再从j到n,要使加和最大,只需令i+1到j-1最小。代码如下:#include<iostream>#include<cstdio>#include<algorithm>using namespace std;int n;long long s=0,maxsum=0,原创 2015-10-15 09:30:44 · 434 阅读 · 0 评论 -
Codevs3269 混合背包
题目大意:我觉得不用说了,题目已经很明显了。鉴于01背包和完全背包已经写过了,这次只说多重背包了。利用2进制思想分解,01背包又考虑了某件物品选与不选的情况,这样就成功将问题转化了。代码如下:#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int n,v原创 2015-10-15 19:43:58 · 545 阅读 · 0 评论 -
Codevs1700 施工路线第二季
前言:这题写得相当费劲,其实还是思路不好。本来想两次dfs找最远点求得树的直径,但不幸多处TLE。后来发现可以用树形DP做,写出来以后还是T,以为是vector的push_back惹的祸,就学了邻接表(邻接表学习处),仍T。最后发现是并查集忘记了路径压缩,于是改后就A了。题目大意:求最小生成树的边权和及树的中心到最远点的距离。思路:kruskal+树形DP。在以任意一点为根建树以后,就可以开始D原创 2015-10-20 16:11:29 · 573 阅读 · 0 评论 -
Codevs3027 线段覆盖2
题目大意:数轴上有n条线段,线段的两端都是整数坐标,坐标范围在0~1000000,每条线段有一个价值,请从n条线段中挑出若干条线段,使得这些线段两两不覆盖(端点可以重合)且线段价值之和最大。思路:如果不是线段而是点,显然这题很容易就能解决。于是我们把每个线段都看成一个点,则记选至第i个线段时的最大价值为f[i],j为不与i相覆盖的且在i之前的线段(当然,如果要从左往右推的话,这里要事先让线段按右端原创 2015-08-23 11:27:49 · 1745 阅读 · 0 评论 -
01背包问题和完全背包问题
叙述一下:01背包问题: 有N件物品和一个容量为V 的背包。放入第i件物品耗费的空间是Ci,得到的价值是Wi。求解将哪些物品装入背包可使价值总和最大。完全背包问题: 有N种物品和一个容量为V 的背包,每种物品都有无限件可用。放入第i种物品的耗费的空间是Ci,得到的价值是Wi。求解:将哪些物品装入背包,可使这些物品的耗费的空间总和不超过背包容量,且价值总和最大。先放代码:01背包问题:f原创 2015-07-02 16:22:44 · 597 阅读 · 0 评论 -
Codevs1090 加分二叉树
思路:不管它是序列型DP还是树形DP,反正就是DP了。我们记f[l,r]为从l至r这一段序列构成的加分二叉树的最大值,那么f[l,r]的值来自于三种情况,即l是根,或r是根,或k(k∈(l,r))是根,说白了就是要在l至r这一段序列中枚举根的位置求最大值。由于我们求的时候要递归到单个节点上再从下往上回溯求解各个f[l,r],所以f[l,r]仅与它下一级的f[l’,r’]有关,不会也不会被上一级影响,原创 2015-08-09 17:17:49 · 854 阅读 · 0 评论 -
Codevs1169 传纸条
首先,必须吐槽的是,这题,经过了各种对拍加上截标准程序片段与本人程序互换以后,仍然WA,最后搞得我把整个四维的f数组都输出了,结果发现,在某一组小数据中,我的f数组总与标准程序的f数组差2。于是乎,我便去找输入了,于是乎,i从1循环到m打成了n……还我的两个半小时!(怨念发作中……)好了,言归正传,题目大意是,从(1,1)走到(m,n)再走回去,途中不经过重复的点累加路径权值的最大值。思路:显然原创 2015-08-24 11:21:31 · 879 阅读 · 0 评论 -
Vijos1002 过河
/*首先进行吐槽:这题交了N遍却总是RE,最后发现是数组开小了…… 结论:对内存省吃俭用不一定有好处……*/思路:转移方程相当明显,即f[i]=f[j]+stonenum[i], j∈[i-t,i-s]。但是,10^9的数据规模直接DP显然不行。注意到m<=100,说明石子在桥上的分布是十分稀疏的,也就是说,有很长一段距离中没有石子,对这一段进行DP完全是浪费,于是我们要进行压缩。但是,压缩的下原创 2015-08-09 10:45:50 · 594 阅读 · 0 评论 -
数字三角形合集
简介数字三角形这东西,出现了有一定的年头了。于是,出现了一些变种……目前已知的题目Codevs1220 数字三角形这题是原版IOI1994啊……f[i][j]=a[i][j]+max(f[i-1][j],f[i-1][j-1])。Codevs2193 数字三角形ww 和 Codevs2198 数字三角形www改了,必须得经过一个点。并且2198是2193的数据规模上的加强版。然而这并没有原创 2015-08-24 08:14:31 · 1097 阅读 · 0 评论 -
POJ3903 Stock Exchange
题目大意:求最长上升子序列……思路:看这数据规模,L<=100000,还一个点多组测试数据,O(n2n^2)的是不用指望了,于是要使用O(nlogn)的算法。说一下该算法:令序列存于数组a中在O(n2n^2)的算法中,我们对于一个f[i]值的确定,需要扫描j=1->i-1的所有a[j]值,并取a[j]<<a[i]时的f[j]的最大值。试想如果存在两个个值x与y,满足x<<y<<i,x<<y,且f原创 2015-08-15 08:51:42 · 779 阅读 · 0 评论 -
Codevs1380 没有上司的舞会
题目大意: Ural大学有N个职员,编号为1~N。他们有从属关系,也就是说他们的关系就像一棵以校长为根的树,父结点就是子结点的直接上司。每个职员有一个快乐指数。现在有个周年庆宴会,要求与会职员的快乐指数最大。但是,没有职员愿和直接上司一起与会。要你求出舞会可以组织出的最大快乐指数。思路:显然,这是一个树形DP。因为一个根节点选不选会产生不同的情况,所以要开一个二维数组进行记录。记f[i][0]表示原创 2015-09-01 19:47:31 · 486 阅读 · 0 评论 -
Codevs1166 矩阵取数游戏
首先吐槽:先是高精加忘了进位时要用+=,WA了几发;后来是高精乘单精写不对,被迫写高精乘高精,这样一来又WA了几发;高精写好后,发现居然T了,于是改成多压几位(多压几位也是可以节省时间的),然而还是T,并没有什么L用;于是再次发现,我居然用了O(n∗m3n*m^3)的算法,被迫改为O(n∗m2n*m^2);于是乎,不T了,WA了三个点;最后发现,改算法时我把区间长度当成了n而不是m(就这还能过7个点原创 2015-09-26 10:44:37 · 787 阅读 · 0 评论 -
Codevs1066 引水入城
前言:又是做到吐血的一道题。膜题解以后才明白这题怎么做。思路:我觉得第一问是很好求的,直接从上往下BFS就够了。第二问被卡住了,但有一点突破口就是,需要确定第一行的某一个格子究竟能控制多少最后一行的格子。通过样例解释,可以观察到这样一点。似乎对于某一个第一排格子,其可以控制连续一段最后一行的格子,且对于有左右相对顺序的两个第一行的格子,其控制的一排格子也有同样的相对顺序。实际上这个猜想是正确的,原创 2015-11-01 18:49:08 · 887 阅读 · 0 评论