
dp
天宇skyblue
这个作者很懒,什么都没留下…
展开
-
hdu5119 DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5119题目大意:给你n(n思路:因为ai不会超过10^6,所以可以设一个上界1dp[i][j]表示前i个数异或和为j的种类数不取a[i]时,dp[i][j] += dp[i-1][j];取a[i]时,dp[i][j^a[i]] += dp[i-1][j];初始状态原创 2016-10-14 14:47:09 · 292 阅读 · 0 评论 -
概率dp
题目:将一个数每次除以它的因子,求除到1的期望 思路:dp[1]=0;dp[i] = (dp[i] + sum(dp[j])(所有因子dp和)+ sum(因子个数和)+1)/sum(因子个数);#include #include #include #include #include #include #include #include #include #原创 2016-04-01 10:57:51 · 337 阅读 · 0 评论 -
区间DP 矩阵相乘复杂度计算
题目:一个 a*b的矩阵与一个b*c的矩阵相乘,复杂度是 a*b*c,会得到一个a*c的矩阵。但是!!!我出题目的时候懵逼了!!!!!,复杂度弄成a*b*b*c了,所以你们就按我的来。现在有N个矩阵连乘,不同的计算顺序复杂度是不一样的,求最小复杂度。a*b的矩阵与一个b*c的矩阵相乘,复杂度是a*b*b*c!!!!!Input 首先是一个N(N在10原创 2016-04-01 10:10:10 · 2017 阅读 · 0 评论 -
状压DP TSP不回到原点
题目大意: 有N个点,你开始在第一个点,现在要求你不重复的遍历所有点(点经过后不能再次经过),问最短距离是多少。2 有N个点,你开始在第一个点,现在要求你不重复的遍历所有点(点经过后不能再次经过),问最短距离是多少。2Input 首先是一个整数N,表示有N个点,接下来是一个N*N的矩阵M,M[i][j]表示第i个点到第j个点的距离是M[i][j].M[i][j]原创 2016-03-31 16:32:27 · 4986 阅读 · 3 评论 -
poj1155树形dp+背包
题目大意:每个用户必须连一个发射器,发射的信号从一个点到另一个点需要费用,问电视台在不亏本的情况下最多可以给多少个用户发射信号。思路:dp[i][j]表示节点i发射j个信号给用户的盈利。注意:dp数组初始化时,dp[i][0] = 0;其余的负无穷,否则会出bug。自己跟着程序走一遍思路会清晰很多。#include #include #include #include #i原创 2016-02-22 16:12:08 · 367 阅读 · 0 评论 -
poj2342树形dp
题目大意:大学周年庆典聚会,每个人有一个欢乐度,每个人都不想和自己的上司碰面,问最大的欢乐度是多少。思路:上下级关系是一棵树,设dp[i][0]表示不选i这个人,dp[i][1]选i这个人,那么显然dp[i][0] += max(dp[i->son][0] , dp[i->son][1]) , dp[i][1] += dp[i->son][0];初始状态为dp[i][1]=res[原创 2016-02-19 12:26:31 · 311 阅读 · 0 评论 -
poj1651 区间dp
题目大意:每次从中间(取出两边)序列中取出一个数,则它的分值是它乘以与它相邻的两数,求去玩所有的中间数后分值和最小为多少思路:区间dp,dp[i][j]表示从i到j的最优解,枚举从i到j最后移除的元素,有dp[i][j] = min(dp[i][j] , a[i]*a[j]*a[k]+dp[i][k]+dp[k][j]);答案是dp[0][n-1].#include #i原创 2016-03-04 11:01:38 · 323 阅读 · 0 评论 -
hdu2196树形dp+邻接表
题目大意:找离每个节点的最远距离思路:dp[i][0]表示子树的最远距离,dp[i][1] 表示子树以外的最远距离,dp[i][2] 表示字数第二远距离第一遍dfs求出dp[i][0]和dp[i][2];第二遍求出dp[i][1],注意第一遍结束后初始化dp[1][1].其他的看代码#include #include #include #include #include原创 2016-02-20 13:58:57 · 320 阅读 · 0 评论 -
poj1463树形dp
题目大意:最少需要多少个点上方士兵,才能观察到所有边。思路:dp[i][0]表示节点上不放士兵,dp[i][1] 表示节点i放士兵。那么dp[i]均可由子树得到。dp[i][0] = dp[j0][1]+dp[j1][1] + …… , dp[i][1] = min(dp[j0][1] , dp[j0][0] ) + min(dp[j1][0] , dp[j1][1]) + ……因为当前节点放原创 2016-02-21 12:46:56 · 261 阅读 · 0 评论 -
hdu2089数位dp
题目很好懂。思路学习别人的,第一次写数位dp。点击打开链接#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;//#pragma c原创 2016-02-24 16:00:33 · 258 阅读 · 0 评论 -
hdu1561树形dp+依赖背包
题目大意:ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗?思路:咋一看就想到了依赖背包,依赖关系的时候建个树。dp[i][j]表示以i为根节点的子树加原创 2016-03-11 11:02:20 · 423 阅读 · 0 评论 -
codeforces 16E 概率+状压dp
思路:n为18.每一为为0则是鱼死了,1则是活着。初始状态:全活着的概率为1当前状态的鱼j杀死鱼k的概率,相遇的概率乘以j杀k的概率,累加至新状态即可。原创 2016-10-12 17:25:10 · 306 阅读 · 0 评论 -
codeforces 431C DP
题目链接:http://codeforces.com/problemset/problem/431/C题目大意:给定一颗k树,问路径和为n,最大值不小于d的k树的所有路径有多少种。、思路:dp[i][0]表示最大值没有达到d的方案数,dp[i][1]表示和为i最大值达到d的方案数。初始化dp[0][0] = 1;#include #include #include #in原创 2016-06-02 18:30:48 · 349 阅读 · 0 评论 -
codeforces 9D DP
题目大意:给你n个节点,问高度大于等于h的二叉搜索树的数量。思路: 另dp[i][j] 表示节点数量为i高度为不大于j的二叉搜索树的数量。则dp[i][j] = sum{dp[k][j-1] * dp[i-k-1][j-1]} ,即节点数量一定时,左右子树的数量有很多种情况,每种情况内用乘法,情况之间用加法。初始化的时候dp[0][i] = 1;即0个节点任意高度的二叉搜索树都只有一种原创 2016-05-09 16:44:03 · 489 阅读 · 0 评论 -
whu1608 遍历子集状压写法
题目大意:给你n个数和s,问最多将n分为多少组,使每组通过加减操作能得到s的组数最多,输出组数接下来粘贴大神代码,以便学习#include #include #include #include using namespace std;typedef long long lint;int n, s, T, a[20];int sum[1 << 20], f[1转载 2016-04-10 14:50:20 · 421 阅读 · 0 评论 -
hiho 1290 2016微软4月笔试 dp
题目大意:给你一个机器人,从左上角走到右下角需要的最少改变格子的次数。格子有.代表空和b代表障碍物组成,可以b变.,也可以.边b。思路:dp[i][j][0]表示当前节点向下走到终点需要的最少改变次数,dp[i][j][1]表示当前节点向右走走到终点的最少改变次数。那么如果当前点需要向右走,就需要判断右面点的dp值哪一个更小,1、如果需要转弯则需要再往右判断一位,如果是b或边界则原创 2016-04-07 21:49:00 · 314 阅读 · 0 评论 -
poj2151概率dp
题目大意:m道题,t个队伍,n个最少题数,给出t*m的概率,表示队伍做出题的概率。求所有队伍都至少出1题,且至少有一个队伍出n道题以上概率。参考:点击打开链接代码:#include #include #include #include #include #include #include #include #include #include #include原创 2016-02-28 17:02:03 · 233 阅读 · 0 评论 -
hdu3555数位dp
题目大意:找在0~n范围内有多少个49!思路:和hdu2089一样的题目#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;//#p原创 2016-02-28 16:08:43 · 262 阅读 · 0 评论 -
hdu4276树形dp
题目大意:给你一棵树,每个点有个价值,每条边有花费,给你最大的花费t,求从1到n可以得到最大的价值是多少思路:树形dp。首先从1到n的这条路唯一且每条边走了一次,可以求出这条路的花费(也可以用最短路的spfa去求),如果比给定的花费t大,则不可到达。否则,将这条路上各边的花费置零,t-=sum。然后dp[i][j]表示节点i及其子树花费了j时可获得的最大的价值。每次计算话费是,边的花费原创 2016-03-12 15:56:44 · 521 阅读 · 0 评论 -
poj2096概率dp
poj的g++输出%.4lf会出错。/** dp求期望的题。 题意:一个软件有s个子系统,会产生n种bug。 某人一天发现一个bug,这个bug属于某种bug,发生在某个子系统中。 求找到所有的n种bug,且每个子系统都找到bug,这样所要的天数的期望。 需要注意的是:bug的数量是无穷大的,所以发现一个bug,出现在原创 2016-03-03 21:02:34 · 278 阅读 · 0 评论 -
51nod1201dp
题意:将N分为若干个不同整数的和,有多少种不同的划分方式,例如:n = 6,{6} {1,5} {2,4} {1,2,3},共4种。由于数据较大,输出Mod 10^9 + 7的结果即可。分析:dp[i][j]表示的是将数字i分成j个不同的数字的划分方法。这样我们就可以知道,数字n最多的划分数量是1+2+3+......+m 递推公式为:dp[i][j] = dp[i-j原创 2016-03-03 16:50:54 · 474 阅读 · 0 评论 -
poj1390区间dp+记忆化搜索
题目大意:一排方块有颜色,每次只能消去相同颜色的块,分值为每次消去数量的平方,求最大和。思路:区间dp,dp[i][j][k]表示从i到j块且j后面有k块与j不想领但同颜色。则j可以和后面的合并也可以和前面的合并。具体看代码#include #include #include #include #include #include #include #inc原创 2016-02-17 14:05:38 · 374 阅读 · 0 评论 -
hdu 5489 LIS变形(删掉连续区间)
题目大意:给定一个序列长度为n,从中去掉长度为l的连续的序列,求剩余序列中的LIS,去掉的序列起始位置随意思路:LIS变形,只要枚举去掉的所有区间就可以了,最大长度等于以区间右边第一个元素开始的LIS+区间左边的小于右边第一个元素的LIS-1.右边的直接逆序求LIS即可。左边的常规LIS。左边的需要计算arr[i+l]在a[1……i]中的最大LIS就是我说的那个加法的后半部分。原创 2016-01-04 17:17:15 · 417 阅读 · 0 评论 -
hdu1950 最大上升子序列
题目:求最大的连续上升子序列。思路:直接二分求,白皮书有详细讲解#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;#define maxn原创 2015-12-31 19:29:41 · 762 阅读 · 0 评论 -
FZU2216 最长连续子序列
题目大意:给定一个序列,长度为n,所有数据大小不超过m,若为0则代表可以是任意数,问最长的连续子序列是多长,(2,3,4,5,)为连续思路:设数组g[i]表示前i个自然数中0的个数,初始化g时若i被访问则g[i]=g[i-1],否则g[i]=g[i-1]+1.那么结果就是从0到m遍历找到g[i]+num(0的个数)的最小上界即可。#include #include #inclu原创 2015-12-31 13:12:31 · 668 阅读 · 0 评论 -
lightOj 1004 数塔
题目大意:类似于数塔,求在一个菱形里每行选一个数的最大值。。。。选的数据必须相邻,,具体看题目思路:每个状态都有上一行的状态决定,当前位置在上一行的位置的基础上选一个最大值即可。。#include #include #include #include #include #include #include #include #include #include #i原创 2016-01-17 16:46:35 · 288 阅读 · 0 评论 -
hdu1159 LCS最长公共子序列
题目大意:求两个字符串a,b的最大公共子序列,子序列定义为可不连续但顺序不乱思路:动态规划,dp[i][j]表示a[0……i-1]和b[0……j-1]的LCS,枚举最后一个字母即a[i-1]和b[j-1],如果a[i-1] == b[j-1],则dp[i][j] = dp[i-1][j-1] + 1; 如果不相等,则dp[i][j] = max(dp[i-1][j],dp[i][j-1])..原创 2015-12-29 16:21:07 · 311 阅读 · 0 评论 -
hdu1025 最长上升子序列
题目大意:2n个村庄,n个富有,n个贫穷,贫穷的需要从富有村庄进口东西,也就是说需要建一条路,一直编号都是从1……n,问最多可以减多少条路,满足贫穷村庄编号大的则相连的富有的编号也大。思路:最长上升子序列问题。ps:输出时因为1和大于1的不一样,原创 2015-12-29 14:00:58 · 320 阅读 · 0 评论 -
FZU2214 超大背包
题目大意:给你一个背包,容量为10^9,物品个数500,价值和小于5000,求最大价值思路:因为容量太大,所以不能按0-1背包问题去求解。注意到物品个数较小,而且价值和只有5000,所以可以逆向思维,求得对应价值下最小的重量,即dp[i]表示总价值为i是的最小重量是多少,则dp[j] = min(dp[j] , dp[j-val[i]]+vol[i]);最后从v(物品总价值开始判断)开始,找到原创 2015-12-29 10:07:11 · 768 阅读 · 0 评论 -
zoj3905 贪心dp
n个蛋糕选一半,使得val最大。dp[i][j]表示前i个蛋糕选j个最大的val,则dp[i][j] = max(dp[i-1][j] , dp[i-1][j-1] + cake[i].a) , j #include using namespace std;#define MAXN 800int dp[MAXN+10][MAXN+10];struct cake{ i原创 2015-10-15 10:08:56 · 346 阅读 · 0 评论 -
hdu1677 转换LIS
题目大意:将小的布娃娃套进大的布娃娃总共需要多少个布娃娃。思路:按宽度作为第一关键字升序排列,高度作为第二关键字降序排列,则高度的LIS就是所求的解。因为宽度是高到低,所以前面的必定能被LIS序列里面的某个数套进去,还有因为20 10不能套进20 10.所以在求LIS是不能用lower_bound(),因为lower_bound()求得是他所处位置但是在等于他本身那个数字的前面。所以要用upp原创 2016-01-04 21:29:59 · 428 阅读 · 0 评论 -
poj2229
题目大意:给你一个数n,只能用2的幂次求和组成,问总共有多少种方案,答案保留九位数。n思路1:递推。因为每个数n的答案ans[n]都是由ans[n-(1思路2:dp。每个状态dp[i]可有两种状态得来,一种是dp[i] = dp[i-1] , 另一种是(dp[i-1) + dp[i>>1])得来。前者是i为奇数时的状态转移,后者是偶数时。对于奇数i来说,是(i-1)增加了1,而且除原创 2016-01-05 10:40:25 · 768 阅读 · 0 评论 -
51nod1042 0-9数位dp递归写法
#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;//#pragma comment(linker, "/STACK:102400000,1024原创 2016-03-01 18:59:06 · 598 阅读 · 0 评论 -
ightoj 1011 状态压缩dp
题目大意:n个男的,n个女的,mat(i, j)表示第i个男的和第j个女的婚配的满意度?,求最大的满意度,一夫一妻………………思路:题目可以转化为给定一个矩阵,求每行各取一个元素列不能冲突的和最大是多少。因为要每行一个元素列不能冲突,所以暴力显然不行,理所当然想到状态压缩dp,事实上买这算是自己第一次独立做状态压缩dp的题目。因为n最大为16,所以可以用一个16位的二进制表示哪一列的数被取了。原创 2016-01-31 12:19:37 · 323 阅读 · 0 评论 -
poj2955区间dp?
题目大意:括号匹配个数思路:dp[i][j] 表示从i到j括号匹配的数量,那么如果i和j位置的括号匹配,则可以求得dp[i][j] = max(dp[i][j] , dp[i+1][j-1] + 2);然后从i到j枚举每一个位置,有dp[i][j] = max(dp[i][j] , dp[i][k] + dp[k][j]) ,另外,最外层的i循环需要从len到0,这样才能包含所有后面的情况。原创 2016-02-11 17:18:53 · 350 阅读 · 0 评论 -
51nod 1050 循环数组最大子段和
题目:N个整数组成的循环序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的连续的子段和的最大值(循环序列是指n个数围成一个圈,因此需要考虑a[n-1],a[n],a[1],a[2]这样的序列)。当所给的整数均为负数时和为0。例如:-2,11,-4,13,-5,-2,和最大的子段为:11,-4,13。和为20。原创 2016-01-24 11:39:31 · 1317 阅读 · 0 评论 -
51nod1393 01串相等 思维
题目:给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。Input一个字符串,只包含01,长度不超过1000000。Output一行一个整数,最长的0与1的个数相等的子串的长度。Input示例1011Output示例2思路:dp[i][0]记录前i个字符中0的个数,dp[i][1]原创 2016-01-24 10:58:01 · 446 阅读 · 0 评论 -
hdu5501 背包+贪心
题目大意:给你n到题目,t分钟时间,没到题目初始分数为a,每分钟减小分数为b,做出来需要c分钟。问最多能得多少分。思路:刚开始以为是01背包,背了半天发现背不动……还应该加个贪心的策略才可以。怎样贪心呢?就是说如果先做A题,那么B题总被扣分数C1可以算出来。同理,先做B,那么A题的总被扣分数C2也可以算出来。如果C2 > C1,那么就先做A,因为这样在得分才能最大化。即做题顺序必定有个最优的。原创 2016-01-06 19:52:07 · 339 阅读 · 0 评论 -
hdu3449 依赖背包
题目大意:给定n个盒子以及每个盒子可以装的物品,买物品必须先买其对应的盒子。现在已知盒子的价格、所有物品的价格和价值,给你w元,问能够得到的最大价值。思路:01背包,但是有依赖,所以是依赖背包。用两次01背包即可。每个盒子可以装的物品用一次01背包,将盒子当成一个大物品,在进行01背包即可,具体看代码,不难懂#include #include #include #includ原创 2016-01-05 20:07:41 · 367 阅读 · 0 评论 -
hdu5410 完全背包+01背包
题目大意:给定背包容量m,物品种类n,每种物品的重量w[i],还有卖的数量x对应的价值a[i]*x+b[i],求最大的价值。思路:01背包选好第一个物品,即确定价值量a[i]+b[i],然后完全背包走一遍,每次价值加a[i]。。。注意数组开的大小,dp[m]而不是dp[n].#include #include #include #include #include #inc原创 2016-01-05 11:23:07 · 589 阅读 · 0 评论