lin
klink
link
這道題出的其實挺好的
顯然是乙個樹形dpdp
dp問題最開始想複雜了
後來發現很簡單
一直以為是n^3做法
我們用dpu
,k
dp_dp
u,k
表示在以u
uu為根的子樹中,剔除k
kk個的最小需要切的邊數
那麼初值就是dpu
,1=d
uu
dp_=du_u
dpu,1
=duu
轉移就是
d pu
,k
=min,
v∈so
n(u)
,j≤k
dp_=\min\+dp_-2\},v\in son(u) ,j\leq k
dpu,k
=min,v
∈son
(u),
j≤k注意我們為什麼需要−2-2
−2呢,因為我們在u,v
u,vu,
v這裡先是預設把他刪掉了,然後我們再把他連上,所以要−2-2
−2答案就是min
\min\\}
min其實就是揹包嘛
#include
using
namespace std;
# define rep(i,a,b) for(int i=a;i<=b;i++)
# define _rep(i,a,b) for(int i=a;i>=b;i--)
# define repg(i,u) for(int i=head[u];~i;i=e[i].next)
typedef
long
long ll;
const
int n=
205;
template
<
typename t>
void
read
(t &x)
int n,p;
int head[n]
,cnt;
int f[n]
[n],ans=int_max;
int siz[n]
,du[n]
;struct edgee[n*n]
;void
add(
int x,
int y)
,head[x]
=cnt;
}void
dfs(
int u,
int fa)
ans=
min(ans,f[u]
[p]);}
intmain()
dfs(1,
0);printf
("%d\n"
,ans)
;return0;
}
P1272 重建道路
p1272 重建道路 題意 有一棵n個點的樹,求刪掉最少的邊數,使得其中p個點的子樹和另一部分分離 dp i j 表示編號為i的點周圍組成j個點的樹最少要刪的邊數 初始狀態 dp i 1 連線這個點的邊數 每個點都是點數為1的樹 然後去考慮連線兩個點,使子樹的點數增多。有兩個點數都是1的樹dp i ...
P1272 重建道路
一開始狀態定義錯了 所以沒有對qwq,以及有幾個坑qwq 首先 f i j 表示以 i 為根的子樹,切除 j 個節點所需要切除的最小邊數,而我一開始定義的是表示以 i 為根的子樹,切除後生成一顆有 j 個節點的子樹,所需要切除的最小邊數。為什麼我的不行吶?因為對於乙個新的子節點更新狀態,它能生成多大...
洛谷 P1272 重建道路
題目描述 一場可怕的 後,人們用n個牲口棚 1 n 150,編號1.n 重建了農夫john的牧場。由於人們沒有時間建設多餘的道路,所以現在從乙個牲口棚到另乙個牲口棚的道路是惟一的。因此,牧場運輸系統可以被構建成一棵樹。john想要知道另一次 會造成多嚴重的破壞。有些道路一旦被毀壞,就會使一棵含有p ...