dp
银之夏雪
这个作者很懒,什么都没留下…
展开
-
51nod1042 0到9的数量(数位dp)
这道题当时困扰了我很长时间,当时我做1的数量的时候是从前往后写的,等写这道题的时候从前往后用了3天还是没做对,情况太多太复杂(主要也是因为我比较菜),下面附上代码#include <iostream>#include <cmath>#include <string.h>using namespace std;long long dp[20];long long Pow(long long原创 2016-03-08 20:32:27 · 1129 阅读 · 0 评论 -
poj1276Cash Machine(多重背包)
我的理解:首先对于一件物品来说,如果这个物品的容量数目已经大于背包的总容量了,那么这与完全背包问题没有区别了。因为完全背包问题就是可以任意的往背包里面放物品,而这时这个物品的容量数目已经大于背包总容量了,所以,也就相当于在背包总容量的范围内,这个物品是可以支持 任意地往背包里面放物品。 如果这个物品的容量*数目小于背包的总容量,那么正常情况下,需要一件一件往里面放找最大值的。但是它的方法是:将第i原创 2016-05-11 11:59:29 · 520 阅读 · 0 评论 -
light oj 1031(区间dp+博弈)
这个题目后面的套路跟石子归并写的差不多,然而这里存在一个小的博弈,就是每次取得最优,dp[i][j] 表示在区间i~j上A比B多的分数值,由于二者都采取最优策略,故可以枚举i~j之间的的数k,取子区间i~k和k+1~j中的最大值(子区间的最大值表示B比A多的分数,因为A取完之后就要改B取了,也是最优的策略), 动态转移方程式为dp[i][j]=max(dp[i][j],max((sum[k]-s原创 2016-05-02 15:42:42 · 322 阅读 · 0 评论 -
51nod1006最长上升子序列(求路径)
这道题目以前完全用char写,现在在尝试用string去写,感觉还不错,思路如下: 我们用Ax表示序列A的连续前x项构成的子序列,即Ax= a1,a2,……ax, By= b1,b2,……by, 我们用LCS(x, y)表示它们的最长公共子序列长度,那原问题等价于求LCS(m,n)。为了方便我们用L(x, y)表示Ax和By的一个最长公共子序列。让我们来看看如何求LCS(x, y)。我们令x表示子原创 2016-05-02 17:23:54 · 785 阅读 · 0 评论 -
hdu3555Bomb(数位dp&&记忆化搜索)
这道题目其实是不要62的简化版,说白了就是找含49的个数,详情#include <iostream>#include <string.h>long long dp[20][5];int digit[20];using namespace std;//dp[i][0]表示不含49的数字//dp[i][1]表示首位为9,不含49的数字//dp[i][2]表示含49的数字void prep原创 2016-05-22 18:35:53 · 810 阅读 · 2 评论 -
51nod1021石子归并(区间dp)
#include <iostream>#include <stdio.h>#include <string.h>using namespace std;int n;int a[205],sum[205];int dp[205][205];//数组差不多得开大一倍const int INF=0x3f3f3f3f;void init(){ memset(dp,0,sizeof(原创 2016-04-19 15:06:34 · 1086 阅读 · 0 评论 -
nefu1130Attack monsters(区间dp)
这道题目让我改错误改了很久,但其实就是一道模板题稍稍变了个型,还有一点就是这个题是乱序的,需要排个序 下面是没优化的代码#include <iostream>#include <string.h>#include <stdio.h>#include <algorithm>using namespace std;int n,l;int sum[305];int dp[305][305]原创 2016-04-20 14:47:07 · 330 阅读 · 0 评论 -
51nod 1022 石子归并 环形+四边形优化
#include <iostream>#include <string.h>#include <stdio.h>using namespace std;int n;int a[2005];int dp[2005][2005],sum[2005][2005],s[2005][2005];//这个地方要注意啊,要开成2nconst int INF=0x3f3f3f3f;void init原创 2016-04-21 20:03:17 · 506 阅读 · 0 评论 -
hdu2089不要62(数位dp)
这个题目我写了两天,刚开始按照固定套路dp【i】【j】表示i位数,j为首位,然后先求不吉利的,然后再抠掉,后来发现很麻烦,然后想那就直接正着求算了,然后j表示末位,表很容易打出来了,然而查的时候一脸懵逼,没办法后来参照了别人的博客,详见http://www.myext.cn/c/a_11441.html,写的真好,下面代码有讲解#include <iostream>#include <string原创 2016-05-18 19:11:07 · 394 阅读 · 0 评论 -
南洋理工之导弹拦截(79)
这是一道非常简单的最长上升子序列的题目,然而刚开始没看出来,想错了,用的二维表示这个导弹是否拦截,还是太菜,代码如下#include <iostream>#include <string.h>#include <algorithm>using namespace std;int a[25],b[25];int dp[25];int T,n;int main(){ cin>>T原创 2016-04-24 10:09:46 · 533 阅读 · 0 评论 -
51nod1083矩阵取数问题
这道题目是51nod教程的第一题,是一道非常简单的题目,之前做过了,再来刷一遍,因为是只能往下或者往右,所以每个点的值为左或上的最大值加自己#include <iostream>#include <string.h>using namespace std;int dp[505][505],a[505][505];int n;int main(){ while(cin>>n)原创 2016-04-24 20:55:02 · 753 阅读 · 0 评论 -
51nod多重背包问题
多重背包其实就是把01背包和完全背包写成两个函数然后调用一下就行了,当给的空间大于物品个数*它的容量的时候,那么对于这个物品来说相当于完全背包,反之则为01背包#include <iostream>using namespace std;int v[105],price[105],num[105];long long dp[50005];void Zero_Pack(int value,int原创 2016-04-20 16:39:04 · 563 阅读 · 0 评论 -
51nod1154回文串划分
这道题目刚开始想错了,本来打算每次找到最大的回文串,结果自己给自己驳倒了,比如dabbbbbdb,最长回文子串是bbbbb,结果四个落单,一共是五个,而如果把最后的bdb放在一组,就一目了然了,4个,所以这种是不行的,到底该如何做呢 dp[j]代表了读到第j个字符的时候出现的回文串最小有多少个 k#include <iostream>using namespace std;const int原创 2016-05-10 21:53:59 · 445 阅读 · 0 评论 -
hdu5379(树形dp)
#include <iostream> #include <cstdio> #include <queue> #include <vector> #include <cstring> #define MOD 1000000007 using namespace std; long long ans; struct node { int id;原创 2016-04-03 17:05:16 · 315 阅读 · 0 评论 -
状态压缩dp入门题 poj3254
本博客是在写的很菜,如若看不懂,可以参看http://www.tuicool.com/articles/JVzMVj,很棒 这道题是一道入门的状态压缩dp,题目大意是农夫有一块地,被划分为m行n列大小相等的格子,其中一些格子是可以放牧的(用1标记),农夫可以在这些格子里放牛,其他格子则不能放牛(用0标记),并且要求不可以使相邻格子都有牛。现在输入数据给出这块地的大小及可否放牧的情况,求该农夫有多少原创 2016-03-21 21:00:16 · 423 阅读 · 0 评论 -
hdu1520(poj2342)(树形dp)
这道题的题目和poj2342是一样的,然而数据量比那道题大,导致我那道题直接交到这个上是TLE,然后呢,对于这道题目,应该用链式前向星来写,这里我用的是双向建边,因为只要是有直接关系就不行,那么我可以认为不用管谁是上级,所以可以双向建边,注意当双向建边的时候数据量是原变数的2倍,否则会RE#include <iostream>#include <string.h>#include <stdio.原创 2016-04-05 19:31:10 · 388 阅读 · 0 评论 -
树形dp poj2342
#include <iostream>#include <string.h>#include <stdio.h>//#pragma comment(linker, "/STACK:10240000,10240000")//扩栈int n;bool vis[6005];int dp[6005][2],pre[6005];using namespace std;void tree_dp(原创 2016-02-29 21:17:09 · 334 阅读 · 0 评论 -
hdu1561(树形dp+01背包) The more, The Better
这道题目刚开始想了一阵,因为是树形dp专题,所以没看出来是01背包(重点是要倒序),倒序这个点之前一直没想出来是为什么,因为宝物只有一个,和01背包是一样的意思(其实我现在我没太想明白既然已经是二维了,又为什么要倒序呢),状态转移方程是dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]);,因为我在建树的过程中以0为跟,相当于多攻破了一座堡垒,做以求的是dp[0][m原创 2016-04-08 21:50:28 · 344 阅读 · 0 评论 -
poj2411
这道题是参照邝斌的博客写的,因为之前接触的比较少嘛 题意: 用1X2的小矩形填满nXm的大矩形,有多少种的方案。 解法: 1、递推关系: dp[i][j] 表示前i-1行填满,第i行状态为j时的方案。 dp[i][j]=sum{ dp[i-1][u] } 2、 从(i-1,u)状态到达(i,j原创 2016-03-27 13:06:32 · 374 阅读 · 0 评论 -
poj1185
这道题目和poj3254属于类型题,思想和方法上都类似,首先,自己做麻烦的第一点在于 a&b 两个十进制的数本身就可以判断两列是否有炮兵对打,而不用像我一开始想象的把十进制转成二进制,再用二进制进行判断,这个已经帮你弄好了。 第二点,本身状态也没有那么多。最多是1024个,再加上用if((i&i<<1)||(i&i<<2)) (这个判断简直了)之后就剩了大概六十个左右好像是。所以将这些合理的状态记原创 2016-03-27 17:02:49 · 431 阅读 · 0 评论 -
poj2955Brackets区间dp(括号匹配)
首先考虑怎么样定义dp让它满足具有通过子结构来求解、 定义dp [ i ] [ j ] 为串中第 i 个到第 j 个括号的最大匹配数目 那么我们假如知道了 i 到 j 区间的最大匹配,那么i+1到 j+1区间的是不是就可以很简单的得到。 那么 假如第 i 个和第 j 个是一对匹配的括号那么dp [ i ] [ j ] = dp [ i+1 ] [ j-1 ] + 2 ; 那么我们只需要从小到原创 2016-04-25 20:02:29 · 500 阅读 · 0 评论 -
51nod1049最大子段和
这是一道子段和的入门问题,非常简单 if(data[i-1]>=0) data[i]=data[i-1]+a[i]; else data[i]=a[i];这就是核心部分,代码如下:#include <iostream>#include <string.h>using namespace std;const int maxn=50005; long long data[maxn],a[maxn原创 2016-04-25 21:30:09 · 406 阅读 · 0 评论 -
poj1141Brackets Sequence(区间dp括号匹配打印路径)
这道题困扰了我一阵,因为之前只会求最大匹配,不会打印路径,后来发现用递归可以实现,首先我们知道前面定义dp [ i ] [ j ] 为串中第 i 个到第 j 个括号的最大匹配数目那么假如我们知道任意 i 到 j 从哪儿插入分点使得匹配添加括号最少。那么我们定义pos【i】【j】表示 i 到 j 从哪儿分开使得匹配添加括号最少,如果i和j匹配我们可以让pos【i】【j】=-1;我们发现在我们之前更新d原创 2016-04-26 11:29:47 · 474 阅读 · 0 评论 -
ACdream 1216Beautiful People(二重最长上升子序列)
题意是:有很多人,有智慧值和魅力值,必须每个人全都比别人高或者都比别人低才行,否则会打架,现在求出最多的不会打架的人数参加晚会 这道题目刚开始听比人说是第一重顺序排序,第二重逆序排序,然后求最长上升子序列,其实并没有想象中的那么简单,1 10,2 12,3 1这组数据如果按照上述说法的话排出来是错的,因为需要输出下标,很显然是错的,那么现在该怎么操作呢,需要一个path数组存放某些东西,刚开始的时原创 2016-06-16 16:09:09 · 323 阅读 · 0 评论