CCF 201909-5 城市规划(树形dp)

题目(图源:CCF官网)

CCF 201909-5 城市规划(树形dp)_第1张图片

CCF 201909-5 城市规划(树形dp)_第2张图片

思路来源

wls

题解

和银川网络赛那个树形dp原题很像哈

u是v的直连父亲,先往下搜,向上回溯时,

枚举边计算贡献,即u和v之间边w,v里面选了p个,则all-v这一块选k-p个

边w被经过p*(k-p)次,

实际转移时,考虑v里取了p个,u在已经搜过的子树里取了q个,

以此来更新dp[u][p+q]的值

dp[u][p]表示在u这棵子树(含u)里选了p个点的最小代价

具体实现时,应考虑p+q<=k,

用加法p+q比用减法p-q快,但考虑更新顺序,故用辅助数组

代码

#include
#include 
#include
#include
#define pb push_back
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair P;
const ll INF=0x3f3f3f3f3f3f3f3fll;
const int N=5e4+10;
const int K=1e2+10;
int n,m,k,u,v,w;
int num[N];
ll dp[N][K],tmp[K];
vector

E[N]; bool ok[N]; void dfs(int u,int fa) { dp[u][0]=0; if(ok[u]) { num[u]=1; dp[u][1]=0; } for(int i=0;i

 

你可能感兴趣的:(#,树形dp/换根dp/长链剖分)