动态规划
文章平均质量分 73
自爄創煇熿
这个作者很懒,什么都没留下…
展开
-
分苹果问题
题目大意:有N个苹果,要把这些苹果粉给2个人,使得这两个人得到的苹果重量差最小。先求得N个苹果的重量总和,分成两堆,差值最小,则有一堆大于或等于SUM/2;有一堆小于等于SUM/2;所以有for(j=sum/2;j>=w[i];j--);只要dp【j】从最大开始第一个等于一的下标就是其中一堆的和,#include#includeint dp[100005];int data[10原创 2012-05-05 13:49:41 · 1194 阅读 · 0 评论 -
poj 1947 树形dp 背包
题意:求得到p个点最少删除多少条边。p个点事连通的。题解:dp【u】【j】 以u为根得到j个点需要的最大价值。对于一个子节点 v 两种选择,要和不要。 不要的话,就删除u与v相连的边。 即dp【u】【j】+=1;要的话,即进行背包 dp【u】【j】=min(dp【u】【j】,dp【u】【j-k】+ dp【v】【k】);对于节点 u 我们没有考虑它的父节点,在最后求解时,dp【原创 2013-07-13 17:25:37 · 489 阅读 · 0 评论 -
poj 1155 树形dp 背包
题意:求最多的用户量。dp【u】【j】代表节点u用户数为 j 时的花费。方程: dp[ u ] [ j ] = max ( dp [ u ] [ j ] , dp [ u ] [ j - k ] + dp [ v ] [ k ] - w ) ;#include#include#include#includeusing namespace std;const int N原创 2013-07-13 18:22:58 · 554 阅读 · 0 评论 -
hdu 3586 树形dp +二分
题意:给n个节点的树,要求使叶子节点与根断开,割掉的边的权值和不超过m。求这些被割边的权值最大中的最小。dp 【u】+=min(dp【v】,w),w 为 u 到 v 的权值。如果w 大于二分的 mid dp【u】+=dp【v】;二分枚举边权。#include#include#include#includeusing namespace std;#define FF fr原创 2013-07-17 15:23:09 · 646 阅读 · 0 评论 -
poj 1849 贪心 ||树形dp
题意是:在m点有两辆车,要清扫所有的路,问走的最短路。和poj1935 差不多,poj 1935 是一个人走的最短路。题解 所有边权和 * 2 —— 树的最长路径。#include#include#include#includeusing namespace std;#define FF freopen("Input.txt","r",stdin)#define m原创 2013-07-18 17:17:44 · 580 阅读 · 0 评论 -
nyoj 项目安排
题意:小明每天都在开源社区上做项目,假设每天他都有很多项目可以选,其中每个项目都有一个开始时间和截止时间,假设做完每个项目后,拿到报酬都是不同的。由于小明马上就要硕士毕业了,面临着买房、买车、给女友买各种包包的鸭梨,但是他的钱包却空空如也,他需要足够的money来充实钱包。万能的网友麻烦你来帮帮小明,如何在最短时间内安排自己手中的项目才能保证赚钱最多(注意:做项目的时候,项目不能并行,即两个项原创 2013-07-23 13:15:34 · 633 阅读 · 0 评论 -
poj 3071 概率dp
题意是:有2^n支队伍,告诉你p【j】【k】表示j打败k的概率。求最后赢得比赛概率最大的队伍。dp【i】【j】 表示在第i回合,j获胜的概率此题需要注意的是比赛队伍的次序,第一回合:1和2 比赛,3和4 ,5 和6 ,7和8, 依次类推;if(((j>>(i-1))^1)==(k>>(i-1))) 判断j和k是否可以比赛;比如3支队伍,可以比赛的队伍是:0 1 1 0原创 2013-07-24 09:43:19 · 636 阅读 · 0 评论 -
hdu 4276 树形dp背包
题意:n个点,n-1条边,每条边有权值,每个点有价值 ,问你能否在T时间内从1走到n,如果能,获得的最大价值。 先用spfa求出1至n的最短路径,并且将1到n最短路径上的边权致零,t减去dis【n】这样以后就可以不用考虑怎样回到n了,就和普通的树形dp一样,状态方程 dp [ u ] [ j ] = max ( dp [ u ][ j ] ,dp[ v] [k ] +原创 2013-08-06 08:28:21 · 626 阅读 · 0 评论 -
poj 1935 树形dp,
题意:一个人在m城镇,想参观这座城的k的城镇,求走过的最短路。题解:假设从m点出发,最后回到m点,则 len为所有点的权值和乘以2,如果不会到m点,应该停留在叶子节点,这个以节点一定离m最远的点,在这条最远的路上,只会走一遍。所以最后结果应为 len 减去离m最远的距离。#include#include#include#includeusing namespace std;#d原创 2013-07-18 11:10:53 · 513 阅读 · 0 评论 -
poj 1655树形dp && poj 3107 &&poj 2378 && poj 3140
题意:给你一个树,删除一个点后,形成的所有新树种,节点个数最多的点为被删点的balance,求最小的balance。用了两次dfs ,第一次求每个节点的子节点的个数(包括本身节点),存在num数组中。第二次dfs,dp【u】=max ( dp[ u ] , n - num [ u ] , num [ v ] )#include#include#include#in原创 2013-07-15 10:04:49 · 853 阅读 · 0 评论 -
hdu 1011 树形dp 背包
题意: 给定n和m,n为节点数,m为你拥有的士兵数,每个士兵可以消灭20个bug,每个节点有bug和values,消灭bug获得该节点的values获得 v 节点的values 必须先消灭v父节点的values。1为入口点,即根节点。dp【u】【j】;表示u节点 j个士兵获得的最大values。则状态方程为: dp [ u ] [ j ] = max ( dp [ u ] [原创 2013-07-13 18:34:33 · 640 阅读 · 0 评论 -
hdu1561 树形dp 背包
解题很好想,状态方程 dp[ u ][ j ]=max( dp[ u ][ j ] ,dp[ u ][ j - k ] + dp[ v ][ k ]);此题还要建边,刚开始没想到建边,自己还写了个建边的以0为根,其实没必要,题目给的信息就够了。状态方程很好想,就是背包是的范围弄错了,调了老大会。#include#include#include#includeusing n原创 2013-07-12 10:17:20 · 751 阅读 · 1 评论 -
CodeForces 219D Choosing Capital for Treeland (树形dp)
题意是:给定n个点,n-1条有向边。求 使该点到所有点改变边方向最少,并输出那些点。题解:正向边权值为0,反向为1.第一次dfs记录每个点到所有子树中需要改变的边的条数。 (自下向上推)第二次dfs由父节点求子节点到所有点的需要改变的边的条数。(自上向下)#include#include#include#include#includeusing namespace std原创 2013-07-10 09:02:53 · 1296 阅读 · 0 评论 -
二维背包
http://acm.hdu.edu.cn/showproblem.php?pid=2159最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到原创 2012-07-10 17:38:41 · 409 阅读 · 0 评论 -
Robberies(背包的01背包的应用)
http://acm.hdu.edu.cn/showproblem.php?pid=2955#include #includestruct ss{ int mon; double pro;};int main(){ int i,j,n,sum,ncase; ss arr[105]; double f[10005],p; scan原创 2012-07-10 17:33:51 · 452 阅读 · 0 评论 -
背包问题
01 背包,有n 种不同的物品,每个物品有两个属性 size 体积,value 价值,现在给一个容量为 w 的背包,问 最多可带走多少价值的物品。 int f[w+1]; //f[x] 表示背包容量为x 时的最大价值 for (int i=0; i for (int j=w; j>=原创 2012-05-28 09:35:33 · 1088 阅读 · 1 评论 -
整数划分n划分成不大于k的放法数
大意为n用1,2,3,、、、、k的数表示n,求种数?实际为完全背包问题,并且用大数拼接代码如下:#include#includeint main(){ int n,m,i,j,k; long long dp[1002],a[1002]; long long inf=1e18; while(~scanf("%d%d",&n,&m)) {原创 2012-07-14 11:14:56 · 2642 阅读 · 0 评论 -
hdu 2546 o1背包,
此题要求余额大于5时可以买任意价值的东西。所以我们把给定的余额w先减去5,在进行01背包。对饭菜的价值排序,是为了当余额大于等于5时,在去买最大价值的东西。dp[i] 代表余额为i时,可以买的最大价值。#include#include#include#includeusing namespace std;int dp[50010];int s[50010];int mai原创 2013-05-19 07:23:41 · 656 阅读 · 0 评论 -
树形dp poj 2342
上午看了想了好长时间,下午用了一个多小时才写出来,主要对回溯没怎么写过。第一题 树形dp。题意就是有关系的两个人不能同时出现。dp1【s】 表示 s点去。dp2【s】 表示s点不去。dp1【s】+=dp2【x】。 //s点去,ze x点不去,s为父节点。dp2【s】+=max(dp1【x】,dp2【x】);// s点不去,则x去或不去的最大的一个。#include#i原创 2013-07-07 16:31:07 · 538 阅读 · 0 评论 -
hdu 2196 树形dp
题意: 求每个点的最远距离。树形dp,做了两天,感觉就是从子节点得到父节点。此题要用到两次dfs, 第一次dfs1用来求所有节点在他子树范围内到叶子节点的最长距离和次长距离。dp1,和dp2第二次dfs2 ,求f【】,如果dp1[s]==dp1[x]+len (s为父节点,x为子节点),则 x 在最长树的分支上,f[x]=max(f[s]+len,dp2[s]+len);原创 2013-07-09 08:28:44 · 433 阅读 · 0 评论 -
poj3342树形dp
和poj2342一样,只是加了判断最大值是否唯一。当dp2【s】>=dp1【s】时,若dp1【x】==dp2【x】;则不唯一。因为父节点不去更优。儿子节点去和不去都一样。结果就不唯一了。特殊考虑的是根节点,如果dp1【root】==dp2【root】 ,则不唯一,因为已经到根节点,不影响其他的点了。此题还可以建单向边,因为给定的条件是老板在后面,#include#include原创 2013-07-09 10:53:09 · 650 阅读 · 0 评论 -
树形dp poj1463
题意就是设置最少的哨兵,能够看到多有的路。二分图也能解决,即二分图最小点覆盖 用vector超内存了,#include#include#includeusing namespace std;#define MAXN 1600#define MAXE 300000struct Edge{ int v; // int next;}edge[MAXE];int原创 2013-07-08 10:07:37 · 455 阅读 · 0 评论 -
整数划分2
整数划分 --- 一个老生长谈的问题: 1) 练练组合数学能力. 2) 练练递归思想 3) 练练DP 总之是一道经典的不能再经典的题目: 这道好题求: 1. 将n划分成若干正整数之和的划分数。 2. 将n划分成k个正整数之和的划分数。 3. 将n划分成最大数不超过k的划分数。 4. 将n划分成若干奇正整数之和的划分数。 5. 将n划分转载 2012-05-04 16:12:26 · 519 阅读 · 0 评论