題目大意:給定乙個 n 個節點的樹,求至少剪掉多少條邊才能使得從樹中分離出乙個大小為 m 的子樹。
題解:考慮樹形 dp,定義 \(dp[u][i][t]\) 為以 u 為根節點與前 i 個子節點構成的子樹中,保留 t 個節點(包括根節點)的最小代價,則狀態轉移方程為 \(dp[u][i][t]=min(dp[u][i][t],dp[u][i-1][t-k]+dp[v][son(v)][k]-2)\),在這裡之所以減掉 2,是因為在前 i-1 個子節點與 u 構成的子樹中,必然不包括第 i 個子節點,因此代價預設算了 1;同理,對於 dp[v] 來說,預設剪掉了 (u,v)。因此,計算答案貢獻時,需要將這個值補上。最後,dp[u][1]初始化為 u 的度。
update on 2019.5.25
加入了上下界優化,時間複雜度為 \(o(n^2)\)。
**如下
#include #define pb push_back
using namespace std;
const int maxn=160;
vectorg[maxn];
int n,p,ans,dp[maxn][maxn],sz[maxn],indeg[maxn];
void dfs(int u,int fa)
ans=min(ans,dp[u][p]);
}void read_and_parse()
memset(dp,0x3f,sizeof(dp));
}void solve()
int main()
重建道路 洛谷p1272
一場可怕的 後,人們用n個牲口棚 1 n 150,編號1.n 重建了農夫john的牧場。由於人們沒有時間建設多餘的道路,所以現在從乙個牲口棚到另乙個牲口棚的道路是惟一的。因此,牧場運輸系統可以被構建成一棵樹。john想要知道另一次 會造成多嚴重的破壞。有些道路一旦被毀壞,就會使一棵含有p 1 p n...
洛谷 P1272 重建道路
題目描述 一場可怕的 後,人們用n個牲口棚 1 n 150,編號1.n 重建了農夫john的牧場。由於人們沒有時間建設多餘的道路,所以現在從乙個牲口棚到另乙個牲口棚的道路是惟一的。因此,牧場運輸系統可以被構建成一棵樹。john想要知道另一次 會造成多嚴重的破壞。有些道路一旦被毀壞,就會使一棵含有p ...
洛谷 P1272 重建道路
題目描述 一場可怕的 後,人們用n個牲口棚 1 n 150,編號1.n 重建了農夫john的牧場。由於人們沒有時間建設多餘的道路,所以現在從乙個牲口棚到另乙個牲口棚的道路是惟一的。因此,牧場運輸系統可以被構建成一棵樹。john想要知道另一次 會造成多嚴重的破壞。有些道路一旦被毀壞,就會使一棵含有p ...