您当前的位置: 首页 > 

*DDL_GzmBlog

暂无认证

  • 0浏览

    0关注

    605博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

[luogu]P1272 重建道路 树形dp+背包问题

*DDL_GzmBlog 发布时间:2022-04-17 15:11:49 ,浏览量:0

前言

传送门 :

思路

状态表示: f [ u ] [ k ] f[u][k] f[u][k]表示以 u u u为根的树中保留 k k k个点需要删除的最小边数

状态转移 f [ u ] [ k ] = m i n ( f [ u ] [ k ] , f [ u ] [ j ] + f [ k − j ] − 2 ) f[u][k] = min(f[u][k],f[u][j]+f[k-j]-2) f[u][k]=min(f[u][k],f[u][j]+f[k−j]−2)

显然我们可以将第二位想象成 背包问题来解决

因为我们在 f [ u ] = 1 f[u]=1 f[u]=1的时候已经计算了一次 1 1 1,第二次再计算 f [ x ] f[x] f[x]的时候重复计算了所以需要减去 2 2 2

Mycode
const int N = 160,INF = 0x3f3f3f3f3f;


int n,p;
vector g[N];
int f[N][N];
int ans;
//f[u][k] 表示以u为根节点 保留k个节点 需要删除最少的边
int deg[N];
void dfs(int u,int fa){
	f[u][1] = deg[u];//全切完只保留自己
	for(auto x : g[u]){
		if(x == fa)continue;
		
		dfs(x,u);
		for(int j = p ; j>=1 ;j -- )
			for(int k = 1;k>n>>p;
	for(int i=1;i>a>>b;
		deg[a] ++ ,deg[b] ++ ;
		g[a].pb(b);g[b].pb(a);
	}
	
	memset(f,0x3f,sizeof f);
	dfs(1,0);
	
	
	for(int i=1;i            
关注
打赏
1657615554
查看更多评论
0.0352s