刷题总结——game(hdu4616)
题目:
Input
The first line contains an integer T, indicating the number of testcases.
For each testcase, the first line contains one integer N(2 <= N <= 50000), the number rooms, and another integer C(1 <= C <= 3), the number of chances to be trapped. Each of the next N lines contains two integers, which are the value of gift in the room and whether have trap in this rooom. Rooms are numbered from 0 to N-1. Each of the next N-1 lines contains two integer A and B(0 <= A,B <= N-1), representing that room A and room B is connected.
All gifts' value are bigger than 0.
Output
For each testcase, output the maximum total value of gifts you can get.
Sample Input
2
3 1
23 0
12 0
123 1
0 2
2 1
3 2
23 0
12 0
123 1
0 2
2 1
Sample Output
146
158
题解
大意:给定一颗树··树上节点有不同价值的礼物···有些节点有陷阱··现可以选择从任意一个节点出发按照任意路线走···但不能返回··规定碰到一定数量的陷阱时就会停止走动··问最多可以拿到多少价值总和的礼物?
写了2个多小时发现有处细节错了··就是一旦碰到规定的陷阱数C就必须停止··然而我的dp并没有注意到这一点··导致整个代码方程直接错了···
参照了网上的方法:http://blog.csdn.net/martinue/article/details/51025232
另外这道题还发现了我的一个误区:求一颗树中的最长链的相关问题··如果我们要确定每个节点上的最长链··也就是说如果问到一个节点我们就能答出它的最长链的话,我们需要按照上一篇文章Bob‘s race那样dp··但遇到类似于这道题··如果只是询问最长链而并不需要知道节点与最长链的对应关系时··我们可以按照这道题的方式进行Dp,详见代码·差别很明显
代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<ctime>
#include<cctype>
#include<string>
#include<cstring>
using namespace std;
const int N=;
const int inf=0x3f3f3f3f;
int first[N],nxt[N*],go[N*],tot,f[N][][],val[N],n,T,C,ans;
bool jud[N];
inline int R()
{
char c;int f=;
for(c=getchar();c<''||c>'';c=getchar());
for(;c<=''&&c>='';c=getchar()) f=(f<<)+(f<<)+c-'';
return f;
}
inline void comb(int a,int b)
{
nxt[++tot]=first[a],first[a]=tot,go[tot]=b;
nxt[++tot]=first[b],first[b]=tot,go[tot]=a;
}
inline void pre()
{
tot=ans=;
memset(first,,sizeof(first));memset(f,-inf,sizeof(f));
}
inline void dfs(int u,int fa)
{
f[u][jud[u]][jud[u]]=val[u];ans=max(ans,val[u]);
for(int e=first[u];e;e=nxt[e])
{
int v=go[e];if(v==fa) continue;
dfs(v,u);
for(int i=;i<=C;i++)
for(int j=;j+i<=C;j++)
{
if(j+i<=C) ans=max(ans,f[u][i][]+f[v][j][]);
if(j+i<C) ans=max(ans,f[u][i][]+f[v][j][]);
if(j!=C) ans=max(ans,f[u][i][]+f[v][j][]);
if(i!=C) ans=max(ans,f[u][i][]+f[v][j][]);
}
for(int i=;i<C;i++)
{
f[u][i+jud[u]][]=max(f[u][i+jud[u]][],f[v][i][]+val[u]);
f[u][i+jud[u]][]=max(f[u][i+jud[u]][],f[v][i][]+val[u]);
}
if(!jud[u]) f[u][C][]=max(f[u][C][],f[v][C][]+val[u]);
}
}
int main()
{
// freopen("a.in","r",stdin);
T=R();int a,b;
while(T--)
{
n=R(),C=R();pre();
for(int i=;i<=n;i++) val[i]=R(),jud[i]=R();
for(int i=;i<n;i++) a=R(),b=R(),comb(a+,b+);
dfs(,);cout<<ans<<endl;
}
return ;
}
刷题总结——game(hdu4616)的更多相关文章
- LeetCode刷题系列
LeetCode 我们工作面试和提高自身数据结构和算法能力的时候往往需要刷刷题,我选择LeetCode是通过一个留学论坛了解的.专业,覆盖语种全面. 提前说说刷题的心得: 尽量手写代码,少使用IDE的 ...
- ife任务刷题总结(一)-css reset与清除浮动
本文同时发布于本人的个人网站www.yaoxiaowen.com 百度创办的前端技术学院,是一个面向大学生的前端技术学习平台.虽然只有大学生才有资格报名,提交代码进行比赛排名.但是这并不妨碍我们这些初 ...
- 刷题ING...
我用codeVS刷题.. 努力准备!!
- XidianOJ 1020 ACMer去刷题吧
题目描述 刷题是每个ACMer必由之路,已知某oj上有n个题目,第i个题目小X能做对的概率为Pi(0<=Pi<=1,1<=i<=n) 求小X至少做对k道题的概率 输入 第一行输 ...
- 【BZOJ-4590】自动刷题机 二分 + 判定
4590: [Shoi2015]自动刷题机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 156 Solved: 63[Submit][Status ...
- NOI题库分治算法刷题记录
今天晚自习机房刷题,有一道题最终WA掉两组,极其不爽,晚上回家补完作业欣然搞定它,特意来写篇博文来记录下 (最想吐槽的是这个叫做分治的分类,里面的题目真的需要分治吗...) 先来说下分治法 分治法的设 ...
- NOI题库刷题日志 (贪心篇题解)
这段时间在NOI题库上刷了刷题,来写点心得和题解 一.寻找平面上的极大点 2704:寻找平面上的极大点 总时间限制: 1000ms 内存限制: 65536kB 描述 在一个平面上,如果有两个点( ...
- 用js刷题的一些坑
leecode可以用js刷题了,我大js越来越被认可了是吧.但是刷题中会因为忽略js的一些特性掉入坑里.我这里总结一下我掉过的坑. 坑1:js中数组对象是引用对象 js中除了object还有数组对象也 ...
- BZOJ4590 自动刷题机
Description 曾经发明了信号增幅仪的发明家SHTSC又公开了他的新发明:自动刷题机--一种可以自动AC题目的神秘装置.自动 刷题机刷题的方式非常简单:首先会瞬间得出题目的正确做法,然后开始写 ...
- PE刷题记录
PE刷题记录 PE60 / 20%dif 这道题比较坑爹. 所有可以相连的素数可以构成一张图,建出这张图,在其中找它的大小为5的团.注意上界的估算,大概在1W以内.1W内有1229个素数,处理出这些素 ...
随机推荐
- HDU 5459 Jesus Is Here (递推,组合数学)
有点麻烦的递推,递推的原则:向小的问题方向分解,注意边界. 字符串的递推式为 定义f为Si中的总方案数 首先可以得到 fi=fi-1+fi-2+组合(si-2,si-1) 然后考虑Si-2和Si-1之 ...
- XManager 远程连接Netbackup图形用户界面
XManager远程连接Netbackup图形用户界面 目标: 在自己的Windows桌面打开Linux的Netbackup图形用户界面 工具: Windows: Xmanager,Xshell, ...
- HTML之基本语法(链接标签、路径的介绍和使用)
一.链接标签 语法:<a href="目标地址">这个标签上展示的内容</a> 作用:可以实现在当前页面跳转到新页面的操作 属性 1.target这个属性可 ...
- HTML_5 (1 2 3的代码总结)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- springboot autoconfig
springboot自动配置的核心思想是:springboot通过spring.factories能把main方法所在类路径以外的bean自动加载 springboot starter验证 我在spr ...
- MFC:DISP_FUNCTION 参数
/*#include <afxdisp.h>DISP_FUNCTION( theClass, pszName, pfnMember, vtRetVal, vtsParams )参数:the ...
- JavaScript -- 内置对象数组
数组 创建数组的基本方式有两种: 1.使用 Array构造函数 语法:new Array() 小括号( )说明: (1)预先知道数组要保存的项目数量 (2)向Array构造函数中传递数组应包含的项 2 ...
- javaweb基础(17)_jsp九个内置对象
一.JSP运行原理 每个JSP 页面在第一次被访问时,WEB容器都会把请求交给JSP引擎(即一个Java程序)去处理.JSP引擎先将JSP翻译成一个_jspServlet(实质上也是一个servlet ...
- node中的定时任务
node-schedule每次都是通过新建一个scheduleJob对象来执行具体方法. 时间数值按下表表示 * * * * * * ┬ ┬ ┬ ┬ ┬ ┬ │ │ │ │ │ | │ │ │ │ │ ...
- java的重载(overload) (2013-10-11-163 写的日志迁移
有以下几点: 1.方法名相同. 2.方法的 参数类型.个数.顺序至少有一项不同. 3.方法的返回类型可以不同. 4.方法的修饰符可以不同. 5.仅返回类型和修饰符不同也不可以构成重载. ----- ...