樹形dp:刷油漆

用f[x][y]表示以x爲根的數裏,選了y個的最大值。

然後樹形dp

是一個揹包啦

我們dfs每一個x,對於每一個x,枚舉他的兒子們,

再一個個枚舉y。

然後再一個個枚舉他的兒子取了幾個(k)

記得要存一下g!!!不然你更新的時候會出點問題。。。

因爲g是沒有用過兒砸的時候的值,不然就不是惹。。。

void find(int x)
{
	f[x][1]=val[x];
	for(int i=0;i<v[x].size();i++)
	{
		if(fa[x]!=v[x][i]) fa[v[x][i]]=x;	
		else continue;
		find(v[x][i]);
		memcpy(g,f[x],sizeof(g));
		for(int j=1;j<=m;j++)
		{ 
			for(int k=0;j+k<=m;k++)
			{
				f[x][j+k]=max(f[x][j+k],g[j]+f[v[x][i]][k]);
			} 
		}
	}
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章