DP
文章平均质量分 50
111111用户昵称不存在00000
这个作者很懒,什么都没留下…
展开
-
POJ2096->概率DP
POJ2096->概率DP题意: 一个软件有s个子系统,会产生n种bug。 某人一天发现一个bug,这个bug属于某种bug,发生在某个子系统中。 求找到所有的n种bug,且每个子系统都找到bug,这样所要的天数的期望。 PS:bug的数量是无穷大的,所以发现一个bug,出现在某个子系统的概率是1/s, 属于某种类型的概率是1/n。 题解:原创 2016-08-18 00:10:48 · 456 阅读 · 0 评论 -
HDU1024->线性DP
HDU1024->线性DP题意: 求一个有n个元素的序列,划分出m个子序列,求这m个子序列的最大和。 题解: dp[i][j]代表前j个数选i个子序列,能得到的最大和。 决策为:第j个数,是在第包含在第i组里面,还是自己独立成组。 状态转移方程: dp[i][j]=max(dp[i][j-1]+num[j],dp[i-1][k]+num[j]) ; 由于采用二维数组,原创 2016-08-18 12:44:22 · 331 阅读 · 0 评论 -
UVA10440->贪心||DP
UVA10440->贪心||DP题意: 一些摆渡船运送汽车,给出往返需要的时间和每辆汽车到渡口的时间,每次最多能装几辆车,求所有汽车都到达对岸的最少次数和最短时间。 题解: 毋庸置疑,所有汽车都到达对岸的最少次数就是汽车总数除以船每次能装的汽车的最多数量,然后向上取整。 时间的计算,每辆车可以是以自己的到达时间为起始时间来计算摆渡船这趟往返后到达渡口的时间;若是运输前一趟汽车后摆渡原创 2016-08-19 10:09:32 · 509 阅读 · 0 评论 -
UVA10128->线性DP
UVA10128->线性DP题意: 有n个身高不同的人排队,从队头能看见p个人,从队尾能看见q个人,求这些人有多少种不同的排列 题解: 这道题可以用DP做,也可以用组合数学做,但是组合数学的做法比较不容易 这里介绍DP的思路: dp[i][j][k]代表队伍里现在一共有i个人,从队头看能看见j个人,从队尾看能看见k个人; 所有人从高到低开始入队,则进来的人可以选择站原创 2016-08-10 00:24:17 · 343 阅读 · 0 评论 -
UVALive6908->线性DP
POJ2096->概率DP题意: 一个软件有s个子系统,会产生n种bug。 某人一天发现一个bug,这个bug属于某种bug,发生在某个子系统中。 求找到所有的n种bug,且每个子系统都找到bug,这样所要的天数的期望。 PS:bug的数量是无穷大的,所以发现一个bug,出现在某个子系统的概率是1/s, 属于某种类型的概率是1/n。 题解:原创 2016-08-22 14:21:26 · 364 阅读 · 0 评论 -
HYSBZ1206->数位DP
HYSBZ1206->数位DP题意: 求一个区间中有多少个数其相邻两位之间的差值大于等于2,不含前导0,只有一位的数字也都算作符合规则。 题解: 典型的数位DP的题目。 dp[i][j]代表第i位为j时,符合要求的数字有多少个。 先初始化,从第1位到第11位依次统计,状态转移方程为: dp[i][j] += dp[i-1][k] (k - j >= 2 || j - k >原创 2016-08-17 17:18:28 · 409 阅读 · 0 评论 -
LightOJ1422->区间DP
LightOJ1422->区间DP题意: 给你n天要穿的衣服,可以套着穿,但是一旦脱下来就不能再穿,问这n天最少需要准备多少件衣服 题解: 题目类型:区间DP dp[i][j]表示区间[i,j]最少需要多少件衣服 (从最小的区间向最大的区间扩展) 如果第i件衣服不能重复利用,则: dp[i][j] = dp[i+1][j] + 1 如果在之后的区间原创 2016-07-29 12:17:01 · 654 阅读 · 0 评论 -
HDU3555->数位DP
//数位DP //从最高位开始向下DP #include #include #include using namespace std ; int bit[40] ; long long dp[40][3] ; //dp[len][0] 代表数字长度为len不含49的个数 //dp[len][1] 代表数字长度为len不含49但是以9开头的个数(显然dp[len][1]包含在dp[l原创 2016-07-12 20:51:23 · 335 阅读 · 0 评论 -
HDU3653->数位DP
//数位DP //判断1-n中有多少个数字含有13且是13的倍数 #include #include #include using namespace std ; int n ; int len ; int bit[20] ; int dp[20][20][3] ; //dp[pos][mod][st] //pos:数位 //mod:余数 //st: st==0末尾不是1 // st=原创 2016-07-12 11:35:18 · 497 阅读 · 0 评论 -
HDU2089->数位DP
//dp[i][0]:第i位没有不吉利数字的个数 //dp[i][1]:第i位没有不吉利数字但最高位数字为2 //dp[i][2]:第i位有不吉利数字 #include #include #include using namespace std ; int m , t ; int dp[10][3] ; int num[10] ; void Init() { memset(dp, 0 ,原创 2016-07-11 23:29:46 · 403 阅读 · 0 评论 -
POJ1463->树形DP
//树形DP //树的最小点覆盖 //f[x][1]以x为根的子树在x上放置的士兵的最少所需的士兵数目 //f[x][0]以x为根的子树x上不放置的士兵的最少所需的士兵数目 //状态转移方程: //如果当前节点选取,则其子节点可选可不选dp[root][1] += min(dp[tree[root][i]][1],dp[tree[root][i]][0]) ; //如果当前节点不选,则其子节点必须原创 2016-07-10 16:56:10 · 1247 阅读 · 0 评论 -
POJ2378->树形DP
//树形DP //去掉哪些点可以使树上联通的节点个数小于n/2 //对树进行后序遍历 //状态转移方程:dp[root] = max(n-sum , mason) ; #include #include #include #include using namespace std ; #define MAX 10005 vector tree[MAX] ; int n;原创 2016-07-10 20:28:45 · 546 阅读 · 0 评论 -
HDU1520->树形DP
//树形DP //没有上司的舞会 //树形DP先确定各个子树,再递归返回根,整个过程相当于树的后序遍历 //本题用vetor模拟树的父子关系 //vector[i]里存放以i为父节点的所有子节点 //状态转移方程: //如果该节点不选:dp[root][0] += max(dp[tree[root][i]][1],dp[tree[root][i]][0]); //如果选取该节点:dp[root][原创 2016-07-10 11:21:59 · 390 阅读 · 0 评论 -
POJ5115->区间DP
//区间DP //DP[i][j]表示杀死(i,j)区间的狼能受到的最小伤害 //区间长度从1开始扩大 //状态转移方程:边界:DP[i][i] = a[i] + b[i-1] + b [i+1] ; // 其他:DP[i][j] = min(DP[i][k-1] + a[k] + DP[k+1][j] ) + b[i-1] + b [j+1] ; //k表示区原创 2016-07-09 17:18:07 · 306 阅读 · 0 评论 -
UVA10154->区间DP
题意:给出一些乌龟的重量和力量,求这些乌龟能叠出的龟塔的最大高度 题解:区间DP,dp[i][j]代表前i只乌龟叠j层的最小重量,从层数开始扩展转移,先求从1-n每个区间叠一层的质量,再求叠两层,以此类推 状态转移方程:if(turtle[i].strength >= dp[i-1][j-1]) dp[i][j] = min(dp[i-1][j] , dp[i-1][j-1]+原创 2016-07-26 11:04:34 · 388 阅读 · 0 评论