自己一開始做的時候知道是dp,但是設計的狀態總是有後效性的(看來還是做題少了),看完題解才恍然大悟。
設dp[u][i][j]表示以u為根的子樹,選取前i個兒子,使用者數為j的最大利潤,用類似區間dp的性質,dp[u][i][j]可以從dp[u][i-1][j-k]+dp[v][size[v]][k]-e[cnt].value轉移過來。
看一下資料範圍和狀態轉移方程,可以發現i這一維可以用滾動陣列優化,這樣空間就過了。
注意點:讀入w[i]時 迴圈變數i從1~m,對應的是w[n-m+i]。
1 #include2 #include3 #include4using
namespace
std;
5const
int maxn=3005;6
int n,m,p[maxn],dp[2
][maxn][maxn],kk[maxn],cnt,w[maxn];
7struct
nodee[maxn];
10void insert(int u,int v,int
value)
17int dfs(int
u)23
int sum=0,t=0;24
for(int i=p[u];i!=-1;i=e[i].next)32}
33 sum+=kk;
34 t=t^1;35
}36return
sum;37}
38int
main()49}
50for(int i=1;i<=m;i++) scanf("
%d",&w[n-m+i]);
51 dfs(1
);52
for(int i=m;i>=0;i--)57}
58return0;
59 }
有線電視網 洛谷p1273
某收費有線電視網計畫轉播一場重要的足球比賽。他們的轉播網和使用者終端構成一棵樹狀結構,這棵樹的根結點位於足球比賽的現場,樹葉為各個使用者終端,其他中轉站為該樹的內部節點。從轉播站到轉播站以及從轉播站到所有使用者終端的訊號傳輸費用都是已知的,一場轉播的總費用等於傳輸訊號的費用總和。現在每個使用者都準備...
有線電視網 洛谷 P1273
只能想到n 3的辦法 一看資料量自閉了。看了題解也是n 3 智障出題人 dp i j 代表以i為根的子樹選j個使用者時得到的最大收益 然後就是樹上揹包轉移一下 最後看根節點上最多選幾個人不虧本 include include include using namespace std const int...
有線電視網 洛谷P1273
題目描述 某收費有線電視網計畫轉播一場重要的足球比賽。他們的轉播網和使用者終端構成一棵樹狀結構,這棵樹的根結點位於足球比賽的現場,樹葉為各個使用者終端,其他中轉站為該樹的內部節點。從轉播站到轉播站以及從轉播站到所有使用者終端的訊號傳輸費用都是已知的,一場轉播的總費用等於傳輸訊號的費用總和。現在每個使...