令 fu,v,s1,s2f_{u,v,s_1,s_2} 表示当前在第 uu 个点,将要走到第 vv 个点,前面有 s1s_1 个罪犯,后面有 s2s_2 个罪犯,将所有罪犯抓到的最小时间。
那么如果 vv 是叶子,下一步可以直接抓到 s1s_1 个罪犯,从 fv,u,s2,0f_{v,u,s_2,0} 转移。
否则,考虑在 TT 时间内是否可以抓到:
判断是否存在一种方案,将 s1s_1 个罪犯分到 vv 的所有子树中,使下一步到每棵子树的最小时间都大于 TT 。如果存在,那么在 TT 时间内无法抓到。
然后用类似背包的做法。
时间复杂度O(n5)O(n^5),但似乎远小于n5n^5。

#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define N 60
#define INF 1e9
vector<int>g[N];
int i,j,k,n,m,p,a[N],c[N][N],f[2][N];
int dp[N][N][N][N];
int x,y,z,Rt,Ans=INF;
inline void Dfs(int x,int y){for(int i=0;i<g[x].size();i++)if(g[x][i]!=y)Dfs(g[x][i],x),a[x]+=a[g[x][i]];
}
inline int Solve(int x,int y,int s1,int s2){if(!s1&&!s2)return 0;if(!s1)return INF;int& A=dp[x][y][s1][s2];if(A<INF)return A;if(g[y].size()==1)return (A=Solve(y,x,s2,0)+c[x][y]);for(int i=0;i<g[y].size();i++)if(g[y][i]!=x)for(int k=0;k<=s1;k++)Solve(y,g[y][i],k,s1+s2-k);memset(f[1],0,sizeof(f[1]));f[1][0]=INF;bool b=0;for(int i=0;i<g[y].size();i++){int v=g[y][i];if(v==x)continue;memset(f[b],0,sizeof(f[b]));for(int j=0;j<=s1;j++)for(int k=0;k+j<=s1;k++)f[b][j+k]=max(f[b][j+k],min(f[b^1][j],Solve(y,v,k,s1+s2-k)));b^=1;}return (A=f[b^1][s1]+c[x][y]);
}
int main(){scanf("%d",&n);for(i=1;i<n;i++){scanf("%d%d%d",&x,&y,&z);g[x].push_back(y);g[y].push_back(x);c[x][y]=c[y][x]=z;}scanf("%d%d",&Rt,&m);for(i=1;i<=m;i++)scanf("%d",&x),a[x]++;Dfs(Rt,0);memset(dp,0x3f,sizeof(dp));for(i=0;i<g[Rt].size();i++)Ans=min(Ans,Solve(Rt,g[Rt][i],a[g[Rt][i]],m-a[g[Rt][i]]));cout<<Ans<<endl;return 0;
}

Codeforces868E Policeman and a Tree -- DP相关推荐

  1. 【Codeforces613D】Kingdom and its Cities【虚树】【Tree DP】

    http://codeforces.com/problemset/problem/613/D 题意: 给出n个点的树,有q个询问,每次询问给出k个重要的点,问至少删掉多少个非重要的点,使得这个重要的点 ...

  2. 【Codeforces613D】Kingdom and its Cities【虚树】【Tree DP】倍增lca

    http://codeforces.com/problemset/problem/613/D 题意: 给出n个点的树,有q个询问,每次询问给出k个重要的点,问至少删掉多少个非重要的点,使得这个重要的点 ...

  3. DP Intro - Tree DP Examples

    因为上次比赛sb地把一道树形dp当费用流做了,受了点刺激,用一天时间稍微搞一下树形DP,今后再好好搞一下) 基于背包原理的树形DP poj 1947 Rebuilding Roads 题意:给你一棵树 ...

  4. BZOJ 2111 [ZJOI2010]Perm 排列计数:Tree dp + Lucas定理

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2111 题意: 给定n,p,问你有多少个1到n的排列P,对于任意整数i∈[2,n]满足P[i ...

  5. HDU 4359 Easy Tree DP? 组合数学+动归

    题意:定义一种树,每个节点的权值都是20到2n-1,每个权值出现一次,每个节点的左子树的权值和小于右子树,除非只有一个子树.给你n和d,问有n个节点且恰好深度是d的这种树有多少种. 比赛的时候我没有做 ...

  6. 省队集训Day3 tree

    [题目描述] RHL 有一天看到 lmc 在玩一个游戏. "愚蠢的人类哟,what are you doing",RHL 说. "我在玩一个游戏.现在这里有一个有 n 个 ...

  7. 【dp】URAL-1018

    这个题目听说是DP tree DP tree自己还不是很熟悉,看了网上的解题报告出的题目, 有点戳,不解释,今后多看看这个方面的问题. ans[i][j] = max(ans[i.leftchild] ...

  8. 【bzoj 4455】小星星(树型DP+容斥原理+dfs建树和计算的2种方式)

    题意:给一个n个点的图和一个n个点的树,求图和树上的点一一对应的方案数.(N<=17) 解法: 1.在树的结构上进行tree DP,f[i][j]表示树上点 i 对应图上点 j 时,这个点所在子 ...

  9. poj 2382 Apple Catching 入门dp

    点击打开链接 #include <iostream> #include <algorithm> using namespace std; const int M =1010; ...

最新文章

  1. 关于TypeError: ‘function‘ object is not subscriptable 报错的解决方法
  2. python【蓝桥杯vip练习题库】ADV-272 change(思维)
  3. Kotlin进行异步操作
  4. 为什么产品经理面试都喜欢问注册问题?
  5. 使用Webtask.io创建一个简单的REST API端点
  6. python 读取excel太慢_实用技巧——Python实现从Excel读取数据并绘制成图像
  7. Python数据结构与算法(3.3)——队列
  8. win7系统蓝屏修复工具如何使用
  9. 使用 spire.doc 将word转pdf
  10. WIN2008R2 激活
  11. 卡巴斯基变相提供一年免费服务
  12. js定时刷新页面数据
  13. 微服务架构之监控预警
  14. 大鱼吃小鱼java程序设计
  15. 微信文章如何增加阅读率
  16. 使用POI编辑Word文档添加文字水印
  17. python计算ks值 代码_python画KS图,求KS值
  18. 计算机二级长春光华学院,长春光华学院排名2021 吉林排名第3全国排名第73
  19. TTL,CMOS,LVTTL,LVCMOS电平标准
  20. ArcGIS全流程从无到有制作一张全国人口专题图(以七普数据为例)

热门文章

  1. vue webpack压缩代码_vue.js - 解决vue-cli打包后自动压缩代码
  2. 光电检测技术(第一二章未完)
  3. 基于NodeJs+MySQL+Vue的小区物业管理信息系统
  4. 解决 Windows 11和 Manjaro 21.2.5 Linux双系统时间不同步(时间不一致)问题:差8小时的问题
  5. web服务器软件:Tomcat入门(window安装和配置Tomcat)
  6. 首富马斯克裁员大反转。
  7. 面试必看:手机扫描二维码的测试用例(建议收藏)
  8. win10鼎信诺为什么安装不了_电脑无法安装win10系统原因和解决方法
  9. MCSD 70-483 Programming in C# 知识梳理(1)
  10. python外星人入侵飞船上下移动_Python 项目练习1 外星人入侵(武装飞船)