刷题总结——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个素数,处理出这些素 ...
随机推荐
- ListView适配器Adapter介绍与优化
一.ListView与Adapter的关系 ListView是Android开发过程中较为常见的组件之一,它将数据以列表的形式展现出来.一般而言,一个ListView由以下三个元素组成: 1.View ...
- 剑指offer18 树的子结构
另一种写法 class Solution { public: bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2) { bool result = f ...
- mysql中添加数据时,报错(incorrect string value:'\xf0\x9f ) 字符转换不正确
这个问题,原因是UTF-8编码有可能是两个.三个.四个字节.Emoji表情或者某些特殊字符是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去. 在网上搜了一下解决问题的方案,我选了一 ...
- VS Code:设置多行注释快捷键
多行注释,也叫块注释. 如何查看,并修改VS Code中的多行注释快捷键呢? 1). 点击 首选项 - 键盘快捷方式 2). 在搜索框中输入 comment 3). 这个时候可以看到“切换块注释”的信 ...
- MySQL 5.7.20绿色版安装详细图文教程
MySQL 5.7.20绿色版安装详细图文教程 MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,目前属于Oracle旗下产品.这篇文章主要介绍了MySQL 5.7.20绿色版安装 ...
- 使用xcode 8 调试ios10
这几天更新了ios10,发现真机不能调试,弹出几个错,表示没有证书.用ios9的真机能调试, 真他么坑,总结一下解决方法. 在BuildSetting 的Signing中Code Signing Id ...
- 【转】浅谈对主成分分析(PCA)算法的理解
以前对PCA算法有过一段时间的研究,但没整理成文章,最近项目又打算用到PCA算法,故趁热打铁整理下PCA算法的知识.本文观点旨在抛砖引玉,不是权威,更不能尽信,只是本人的一点体会. 主成分分析(PCA ...
- STL之stack操作
c++ stl栈stack介绍 C++ Stack(堆栈) 是一个容器类的改编,为程序员提供了堆栈的全部功能,——也就是说实现了一个先进后出(FILO)的数据结构. c++ stl栈stack的头文件 ...
- pandas的数据联级
一.索引的堆(stack) 1.行列的转化: Stack():列转行 Unstack():行转列 Stack对应行, 使用小技巧:使用stack()的时候,level等于哪一个,哪一个就消失,出现在行 ...
- Linux常用快捷键以及如何查看命令帮助
1.1 Linux系统快速操作常用快捷键 快捷键名称 快捷作用 Ctrl + a 将光标移至行首 Ctrl + e 将光标移至行尾 Ctrl + u 前提光标在行尾,则清除当前行所有的内容(有空 ...