poj 2408 Apple Tree
http://poj.org/problem?id=2486
典型的回溯题目:特别是状态方程用三维的来标记是否要走回路。
- 题意:一颗树,n个点(1-n),n-1条边,每个点上有一个权值,求从1出发,走V步,最多能遍历到的权值
- 思路:
树形dp,比较经典的一个树形dp。首先很容易就可以想到用dp[root][k]表示以root为根的子树中最多走k时所能获得的最多苹果数,接下去我们很习惯地会想到将k步在root的所有子结点中分配,也就是进行一次背包,就可以得出此时状态的最优解了,但是这里还有一个问题,那就是在进行背包的时候,对于某个孩子son走完之后是否回到根结点会对后面是否还能分配有影响,为了解决这个问题,我们只需要在状态中增加一维就可以了,用dp[root][k][0]表示在子树root中最多走k步,最后还是回到root处的最大值,dp[root][k][1]表示在子树root中最多走k步,最后不回到root处的最大值。由此就可以得出状态转移方程了:
Time Limit: 1000MS | Memory Limit: 65536K | |
Total Submissions: 6836 | Accepted: 2268 |
Description
Input
Note: Wshxzt starts at Node 1.
Output
Sample Input
- 2 1
- 0 11
- 1 2
- 3 2
- 0 1 2
- 1 2
- 1 3
Sample Output
- 11
- 2
dp[root][j][0] = MAX (dp[root][j][0] , dp[root][j-k][0] + dp[son][k-2][0]);//从s出发,要回到s,需要多走两步s-t,t-s,分配给t子树k步,其他子树j-k步,都返回
dp[root][j]][1] = MAX( dp[root][j][1] , dp[root][j-k][0] + dp[son][k-1][1]) ;//先遍历s的其他子树,回到s,遍历t子树,在当前子树t不返回,多走一步
dp[root][j][1] = MAX (dp[root][j][1] , dp[root][j-k][1] + dp[son][k-2][0]);//不回到s(去s的其他子树),在t子树返回,同样有多出两步
- //(1)dp[i][j+2][0] = max(dp[i][j+2][0], dp[i][j-k][0]+dp[son][k][0]);
- //(2)dp[i][j+1][1] = max(dp[i][j+1][1], dp[i][j-k][0]+dp[son][k][1]); 人留在i的子节点son的子树中
- //(3)dp[i][j+2][1] = max(dp[i][j+2][1], dp[i][j-k][1]+dp[son][k][0]); 人留在不是son的i的子节点的子树中
- #include<iostream>
- #include<cstring>
- #include<cstdio>
- using namespace std;
- int dp[300][300][3],head[300],vis[300],w[300];
- int len,n,k;
- struct node
- {
- int now,next;
- } tree[505];
- int max(int x,int y)
- {
- if(x>y)
- return x;
- else
- return y;
- }
- void add(int x,int y)
- {
- tree[len].now = y;
- tree[len].next = head[x];
- head[x] = len++;
- }
- void dfs(int root,int mark)
- {
- int j,son,t,i;
- for(i=0;i<=k;i++)
- dp[root][i][0] = dp[root][i][1] = w[root];
- for(i=head[root];i!=-1;i=tree[i].next)
- {
- printf("i=%d\n",i);
- son = tree[i].now;
- if(son == mark)//已经加了,就不要加,不然就死循环。
- continue;
- dfs(son,root);
- for(j = k; j>=1; j--)
- {
- for(t = 1; t<=j; t++)
- {
- dp[root][j][1]=max(dp[root][j][1],dp[root][j-t][1]+dp[son][t-2][1]);
- dp[root][j][0]=max(dp[root][j][0],dp[root][j-t][1]+dp[son][t-1][0]);
- dp[root][j][0]=max(dp[root][j][0],dp[root][j-t][0]+dp[son][t-2][1]);
- }
- }
- }
- }
- int main()
- {
- int i,a,b,j;
- while(~scanf("%d%d",&n,&k))
- {
- len=0;
- memset(head,-1,sizeof(head));
- memset(dp,0,sizeof(dp));
- memset(vis,0,sizeof(vis));
- memset(w,0,sizeof(w));
- for(i = 1; i<=n; i++)
- {
- scanf("%d",&w[i]);
- }
- for(i=1;i<n;i++)
- {
- cin>>a>>b;
- add(a,b);
- add(b,a);
- }
- dfs(1,0);
- printf("%d\n",max(dp[1][k][0],dp[1][k][1]));
- }
- return 0;
- }
poj 2408 Apple Tree的更多相关文章
- POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和)
POJ.3321 Apple Tree ( DFS序 线段树 单点更新 区间求和) 题意分析 卡卡屋前有一株苹果树,每年秋天,树上长了许多苹果.卡卡很喜欢苹果.树上有N个节点,卡卡给他们编号1到N,根 ...
- POJ - 3321 Apple Tree (线段树 + 建树 + 思维转换)
id=10486" target="_blank" style="color:blue; text-decoration:none">POJ - ...
- POJ 2486 Apple Tree
好抽象的树形DP......... Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 6411 Accepte ...
- poj 3321:Apple Tree(树状数组,提高题)
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 18623 Accepted: 5629 Descr ...
- poj 3321 Apple Tree dfs序+线段树
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Description There is an apple tree outsid ...
- POJ 3321 Apple Tree(DFS序+线段树单点修改区间查询)
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 25904 Accepted: 7682 Descr ...
- poj 2486 Apple Tree(树形DP 状态方程有点难想)
Apple Tree Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9808 Accepted: 3260 Descri ...
- POJ 3321 Apple Tree 【树状数组+建树】
题目链接:http://poj.org/problem?id=3321 Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submiss ...
- #5 DIV2 A POJ 3321 Apple Tree 摘苹果 构建线段树
Apple Tree Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 25232 Accepted: 7503 Descr ...
随机推荐
- Java_Activiti5_菜鸟也来学Activiti5工作流_之初识常用服务类和数据表(二)
/** * 代码清单中使用 ProcessEngines类加载默认的流程配置文件(activiti.cfg.xml),再获取各个服务组件的实例. * RepositoryService主要用于管理流程 ...
- 自己写的自动生成动态边框的jquery小插件
思路就是在元素四周添加<ul>列表,然后周期性地改变它的颜色,实现动态的效果,不支持ie7.ie8 预览链接http://gorey.sinaapp.com/myBorder/border ...
- 在企业级开发中使用Try...Catch...会影响效率吗?
感谢神啊.上帝及老天爷让我失眠,才能够有了本篇文章. 记得不久之前,公司一同事曾经说过:“如果是Winform开发,由于程序是在本地,使用try...catch不会有太大性能问题,可是如果是在web服 ...
- 取出当前会话的sid等
select distinct sess.SID db_sid, sess.SERIAL# db_serial#, process. ...
- LNMP安装WordPress3.4.2看不到主题解决方法
喜欢LNMP配置环境的朋友,又是wordpress建立的博客程序,安装之后发现一个问题在网站后台看不到模板主题,重新下载了一款新的主题也查看不了.开始以为是程序的问题,于是我重新下载新版本的WordP ...
- Spring(一)简述(转载)
原文出自:http://www.cnblogs.com/liunanjava/p/4396794.html 一.Spring简述 Spring是一个开源框架,Spring是于2003 年兴起的一个轻量 ...
- dede操作成功信息提示修改
函数修改 include/common.func.php 文件 function ShowMsg()函数
- Python自动化运维之26、Web框架本质、MVC与MTV
一.Web框架本质 众所周知,对于所有的Web应用,本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python #coding:ut ...
- ipython与python的区别
http://mba.shengwushibie.com/itbook/BookChapter.asp?id=8745 http://www.cnblogs.com/yangze/archive/20 ...
- 关于set或map的key使用自定义类型的问题
我们都知道set或map的key使用自定义类型时必须重载<关系运算符 但是,还有一个条件,所调用重载的小于操作符,使用的对象必须是const 而对象调用的方法也必须是const的 1 #incl ...