此题能否这样设计状态
查看原帖
此题能否这样设计状态
766275
IAKIOI2020楼主2024/11/25 22:03

造了几个大洋里没有过,还请dalao指教QAQ

把一个消防站想成一个强度为2的脉冲,每次强度减1。

dp[u][k]k[0,2]dp[u][k],k\in[0,2] 表示以u为子树,u点的脉冲强度为k

dfs代码:

void dfs(int u,int fa){
//	cout<<u<<endl;
	dp[u][2]=1,dp[u][0]=0;
	if(head[u]) dp[u][1]=0;
	int mi1=inf,flag1=0;
	int mi2=inf,flag2=0;
	for(int i=head[u];i;i=ne[i]){
		int v=to[i];
		if(v==fa) continue;
		dfs(v,u);
		dp[u][2]+=min(dp[v][0],min(dp[v][1],dp[v][2]));
		
		if(dp[v][1]<=dp[v][0]) dp[u][0]+=dp[v][1],flag1=1;
		else dp[u][0]+=dp[v][0],mi1=min(mi1,-dp[v][0]+dp[v][1]);
		
		int bb=min(dp[v][0],dp[v][1]);
		if(dp[v][2]<=bb) dp[u][1]+=dp[v][2],flag2=1;
		else dp[u][1]+=bb,mi2=min(mi2,-bb+dp[v][2]);
	}
	if(!flag1) dp[u][0]=min(dp[u][0]+mi1,inf);
	if(!flag2) dp[u][1]=min(dp[u][1]+mi2,inf);
}
2024/11/25 22:03
加载中...