【题解】 bzoj4472: [Jsoi2015]salesman (动态规划)
Solution:
题面意思:从\(1\)号节点出发,每到一个节点就必须停下,获得节点权值(每个节点只会获得一次),每个点有个规定的停留次数,求最大可获得多大权值,并且判断是否只有唯一的路线才能获得这个权值
- 直接\(dp\)储存子树最大获得权值就行,顺便要记录方案是否唯一,所以我们可以拿一个结构体来记录
- \(dp\)权值思路:找出所有子树中前\(vis[i]-1\)大的节点权值(只选大于\(0\)的权值)。
- \(dp\)方案思路: 1.如果有选择的节点是方案不唯一的,该子树根节点也是方案不唯一。 2. 如果有子节点权值为\(0\),该子树根节点方案不唯一。 3.如果选择的最后一个和不选择的第一个权值一样(且都大于\(0\)),该子树根节点方案不唯一。
Attention:
- 记录子树的结构体时用\(vector\)更好,不然容易超时越界一堆问题(不会用\(vector\)强行卡代码时间卡过去了)
Code:
//It is coded by Ning_Mew on 4.22
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
int read(){
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*f;
}
int n,val[maxn],fa[maxn],vis[maxn];
struct Node{
int val;bool uni;
Node(){val=0;uni=false;}
}node[maxn];
int head[maxn],cnt=0;
struct Edge{int nxt,to;}edge[maxn*2];
void add(int from,int to){
edge[++cnt].nxt=head[from];
edge[cnt].to=to;
head[from]=cnt;
}
bool cmp(const Node &x,const Node &y){return x.val>y.val;}
void dfs(int u){
bool son=false;
Node box[maxn/128];int ct=0;
for(int i=head[u];i!=0;i=edge[i].nxt){
int v=edge[i].to;if(v==fa[u])continue;
fa[v]=u;son=true;
dfs(v);
ct++; box[ct]=node[v];
}
if(!son){node[u].val=val[u]; node[u].uni=false;return;}
sort(box+1,box+ct+1,cmp);
for(int i=1;i<=min(vis[u]-1,ct);i++){
if(box[i].val>=0){
node[u].val+=box[i].val;
if(box[i].uni)node[u].uni=true;
if(box[i].val==0){node[u].uni=true;break;}
}else break;
}
node[u].val+=val[u];
if(vis[u]-1<ct&&box[ vis[u] ].val==box[ vis[u]-1 ].val&&box[ vis[u] ].val>=0)node[u].uni=true;
return;
}
int main(){
//freopen("in.in","r",stdin);
memset(head,0,sizeof(head));cnt=0;
scanf("%d",&n);
vis[1]=maxn;
for(int i=2;i<=n;i++)/*val[i]=read();*/scanf("%d",&val[i]);
for(int i=2;i<=n;i++)/*vis[i]=read();*/scanf("%d",&vis[i]);
for(int i=1;i<=n-1;i++){
int u,v;/*u=read();v=read();*/scanf("%d%d",&u,&v);
add(u,v);add(v,u);
}
dfs(1);
printf("%d\n",node[1].val);
if(!node[1].uni)printf("solution is unique\n");
else printf("solution is not unique\n");
return 0;
}
【题解】 bzoj4472: [Jsoi2015]salesman (动态规划)的更多相关文章
- bzoj4472:[Jsoi2015]salesman
传送门 树形dp 对于每个点维护其子节点的走法是否唯一,每次取最大的并且不为负的(停留次数-1)个子儿子权值,然后判断走法是否唯一 假如有子节点的权值为0,走法也不唯一 代码: #include< ...
- bzoj4472: [Jsoi2015]salesman(树形dp)
Description 某售货员小T要到若干城镇去推销商品,由于该地区是交通不便的山区,任意两个城镇之间都只有唯一的可能经过其它城镇的路线. 小T 可以准确地估计出在每个城镇停留的净收益.这些净收益可 ...
- BZOJ 4472 [Jsoi2015]salesman(树形DP)
4472: [Jsoi2015]salesman Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 417 Solved: 192[Submit][St ...
- 题解【BZOJ4472】[JSOI2015]salesman
题面 树形\(\text{DP}\)与贪心的结合. 首先考虑树形\(\text{DP}\). 设\(dp_i\)表示从\(i\)出发,访问\(i\)的子树,并且最后回到\(i\)能获得的最大收益. 转 ...
- [题解][SHOI2013]超级跳马 动态规划/递推式/矩阵快速幂优化
这道题... 让我见识了纪中的强大 这道题是来纪中第二天(7.2)做的,这么晚写题解是因为 我去学矩阵乘法啦啦啦啦啦对矩阵乘法一窍不通的童鞋戳链接啦 层层递推会TLE,正解矩阵快速幂 首先题意就是给你 ...
- 洛谷P2258 子矩阵 题解 状态压缩/枚举/动态规划
作者:zifeiy 标签:状态压缩.枚举.动态规划 题目链接:https://www.luogu.org/problem/P2258 这道题目状态压缩是肯定的,我们需要用二进制来枚举状态. 江湖上有一 ...
- JSOI2015 Salesman(树型DP)
[luogu6082] [题目描述] 某售货员小T要到若干城镇去推销商品,由于该地区是交通不便的山区,任意两个城镇之间都只有唯一的可能经过其它城镇的路线. 小T 可以准确地估计出在每个城镇停留的净收益 ...
- 【BZOJ1471】不相交路径 题解(拓扑排序+动态规划+容斥原理)
题目描述 在有向无环图上给你两个起点和终点分别为$a,b,c,d$.问有几种路径方案使得能从$a$走到$b$的同时能从$c$走到$d$,且两个路径没有交点. $1\leq n\leq 200,1\le ...
- 【题解】JSOI2015染色问题
好像这个容斥还是明显的.一共有三个要求,可以用组合数先满足一个,再用容斥解决剩下的两个维.(反正这题数据范围这么小,随便乱搞都可以).用 \(a[k][i]\) 表示使用 \(k\) 种颜色,至少有 ...
随机推荐
- samba服务器配置及window网络磁盘映射
1. Samba服务器工作原理 客户端向Samba服务器发起请求,请求访问共享目录,Samba服务器接收请求,查询smb.conf文件,查看共享目录是否存在,以及来访者的访问权限,如果来访者具有相应的 ...
- Android之基于小米天气的天气源库
大概去年的这个时候,有跟大家分享简洁天气这个应用. 该应用一開始使用的是中国天气网的数据,可是,由于须要反复多次请求server获取信息才干满足我们的需求,因此.后来我偷偷的将天气源更换成" ...
- Python3入门(七)——模块
在Python中,一个.py文件就称之为一个模块(Module).(例如main.py就称之为main模块) 为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package). ...
- 20155207王雪纯《网络对抗》Exp4 恶意代码分析
20155207 <网络对抗> 恶意代码分析 学习总结 实践目标 1.是监控你自己系统的运行状态,看有没有可疑的程序在运行. 2.是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件 ...
- 2017-2018-2 20155230《网络对抗技术》实验8:Web基础
实践过程记录 1.Web前端HTML 首先用指令sudo apt-get install apache2下载apache,由于实验机已经安装好Apache,这里就不演示了,对于Apache使用的端口我 ...
- 2017-2018-2 20155233『网络对抗技术』Exp6:信息收集与漏洞扫描
通过DNS和IP挖掘目标网站的信息 whois查询:用来进行域名注册信息查询,以得到3R注册信息,包括注册人的名字.组织.城市等信息.(进行whois查询时去掉www等前缀,因为注册域名时通常会注册一 ...
- 2017-2018-2 20155315《网络对抗技术》Exp8 :Web基础
实验目的 理解HTML,学会Web前端.Web后端和数据库编程及SQL注入.XSS攻击测试 教程 实验内容 操作程序规律 运行脚本或可执行文件 查看配置文件 出错找日志 Web前端HTML 能正常安装 ...
- linux & windows下重启oracle
Linux:方法1 用root以ssh登录到linux,打开终端输入以下命令: cd $ORACLE_HOME #进入到oracle的安装目录 dbstart #重启服务器 lsnrctl start ...
- 学习JAVA第一章的心得
我抱着万分期待的心情开始了我第一天的JAVA学习课程,其实在第一开始的时候我对计算机行业便有很高地兴趣了.这主要归功于我真的从很小开始就就接触了电脑.进入学校以来,我就很期待老师会怎样教我们,会怎样带 ...
- C#_父窗体跟子窗体的控件操作
很多人都苦恼于如何在子窗体中操作主窗体上的控件,或者在主窗体中操作子窗体上的控件.相比较而言,后面稍微简单一些,只要在主窗体中创建子窗体的时候,保留所创建子窗体对象即可. 下面重点介绍前一种,目前常见 ...