NOIP模拟(20171026)T3 大逃杀
来源:互联网 发布:星星知我心演员胡家玮 编辑:程序博客网 时间:2024/06/07 10:27
一棵带权树,第一次经过一个节点需ti时间,获得wi的武力值
求T时间内获得的最大武力值
树形dp神题(告诉了我什么叫转移顺序)
转移即可(说的容易!!!)
注意,转移时一定一定一定要用上一个子树的状态来更新这个子树的状态(类似背包的降维优化)
注意,树边权可为0(个中含义自行体会)
#include<bits/stdc++.h>#define LEN 350/*中间一对地方不能反,反了的话,呵呵*/using namespace std;inline int getint(){ int x=0,p=1; char c=getchar(); while(!isdigit(c)){ if(c=='-')p=-1; c=getchar(); } while(isdigit(c)){ x=(x<<3)+(x<<1)+(c^'0'); c=getchar(); } return x*p;}inline void putint(long long x){ if(x<0){ x=-x; putchar('-'); } static int buf[30]; int tot=0; do{ buf[tot++]=x%10; x/=10; }while(x); while(tot)putchar(buf[--tot]+'0');}int n,T;struct road{ int e,nxt,len;}r[LEN*2];struct node{ int first,fa,w,t; int dp[LEN][5];}t[LEN];int tot=1;inline void creat(int a,int b,int c){ r[++tot].e=b; r[tot].len=c; r[tot].nxt=t[a].first; t[a].first=tot;}int ans=0;void dfs(int cur){ for(int i=0;i<=300;++i){ for(int j=0;j<5;++j){ t[cur].dp[i][j]=-0xfffffff; } } for(int i=t[cur].t;i<=300;++i){ t[cur].dp[i][0]=t[cur].dp[i][1]=t[cur].dp[i][2]=t[cur].w; } for(int i=t[cur].first;i;i=r[i].nxt){ int v=r[i].e; if(v==t[cur].fa)continue; t[v].fa=cur; dfs(v); for(int j=T;j>=0;--j){ //不能反 for(int k=0;k<=T;++k){ //不能反*2 if(j-r[i].len*2-k>=t[cur].t) t[cur].dp[j][2]= max(t[cur].dp[j][2], t[cur].dp[j-r[i].len*2-k][2]+t[v].dp[k][0]); if(j-r[i].len*2-k>=t[cur].t) t[cur].dp[j][2]= max(t[cur].dp[j][2],t[cur].dp[j-r[i].len*2-k][0]+t[v].dp[k][2]); if(j-r[i].len-k>=t[cur].t) t[cur].dp[j][2]= max(t[cur].dp[j][2],t[cur].dp[j-r[i].len-k][1]+t[v].dp[k][1]); if(j-r[i].len*2-k>=t[cur].t) t[cur].dp[j][1]= max(t[cur].dp[j][1],t[cur].dp[j-r[i].len*2-k][1]+t[v].dp[k][0]); if(j-r[i].len-k>=t[cur].t) t[cur].dp[j][1]= max(t[cur].dp[j][1],t[cur].dp[j-r[i].len-k][0]+t[v].dp[k][1]); if(j-r[i].len*2-k>=t[cur].t) t[cur].dp[j][0]= max(t[cur].dp[j][0],t[cur].dp[j-r[i].len*2-k][0]+t[v].dp[k][0]); //不能反*3 } } } //cout<<cur<<endl; for(int j=T;j>=0;--j){ //cout<<j<<" "<<t[cur].dp[j][0]<<" "<<t[cur].dp[j][1]<<" "<<t[cur].dp[j][2]<<endl; ans=max(ans,max(t[cur].dp[j][0],(t[cur].dp[j][1],t[cur].dp[j][2]))); }}int main(){ n=getint(),T=getint(); bool f=1; for(int i=1;i<=n;++i){ t[i].w=getint(); if(t[i].w)f=0; } if(f){ cout<<0; return 0; } for(int i=1;i<=n;++i){ t[i].t=getint(); } for(int i=1;i<n;++i){ int a=getint(),b=getint(),c=getint(); creat(a,b,c),creat(b,a,c); } dfs(1); cout<<ans<<endl; return 0;}
阅读全文
0 0
- NOIP模拟(20171026)T3 大逃杀
- NOIP模拟(10.26)T3 大逃杀
- 【NOIP 模拟题】[T3] 约会(lca)
- NOIP模拟(10.19)T3 放盒子
- NOIP模拟(10.20)T3 裁剪表格
- NOIP模拟(20171023)T3 拆网线
- NOIP模拟(10.22)T3 树
- NOIP模拟(10.23)T3 拆网线
- NOIP模拟(10.24)T3 Math
- NOIP模拟(20171024)T3 数学
- NOIP模拟(10.27)T3 心灵治愈
- NOIP模拟(10.30)T3 星星
- NOIP模拟(10.31)T3 纸带
- NOIP模拟(20171030)T3 星星
- NOIP模拟(11.07)T3 图
- NOIP模拟(20171031)T3 纸带
- noip模拟11.3 T3
- 【20160904】NOIP模拟赛T3
- particles system学习
- centos 安装MySQLdb
- Mysql 第三篇:完整性约束
- ffmpeg转码
- ECSHOP解决Deprecated: preg_replace()报错
- NOIP模拟(20171026)T3 大逃杀
- [剑指offer]算法1二维数组中的查找
- POJ-1797-Heavy Transportation(草稿)
- 1,河内之塔
- HBase建表时报错问题之:ERROR: org.apache.hadoop.hbase.PleaseHoldException: Master is initializing
- myBatis-list数据插入Oracle
- C++中istringstream的用法
- soap相关元素的介绍
- 自己动手搭梯子——从vps到SSR菜鸟教程