1. 程式人生 > >[vijos 1642]班長的任務 [樹形dp]

[vijos 1642]班長的任務 [樹形dp]

c++ 編程 輸出 不能 push_back from || logs 由於

背景

十八居士的畢業典禮(1)

描述

福州時代中學2009屆十班同學畢業了,於是班長PRT開始籌辦畢業晚會,但是由於條件有限,可能每個同學不能都去,但每個人都有一個權值,PRT希望來的同學們的權值總和最大。

十班有一個周密的電話通知網絡,它其實就是一棵樹,根結點為班長PRT,由她來負責通知她的下線(也就是兒子節點),下線們繼續通知自己的下線(不一定每個下線都要通知),任何人都可以不去:”
為了使權值總和最大,班長想安排一下人,但是人數很多,人腦是難以應付的,所以她找到十八居士,讓他編程用電腦解決。

格式

輸入格式

輸入第一行兩個整數n,m表示有n位同學,至多只能去m位同學。(1<=m<=n)

接下來2*n行,每兩行代表一個同學的信息(如果這位同學沒有子節點,就只有一行)。

每個同學的第一行兩個整數p,s,表示這位同學權值為p,子節點個數s;(-100<=p<=100)
第二行s個整數,表示這位同學的子節點的編號。

班長的編號一定為1。

對於20%數據1<=n<=10
對於60%數據1<=n<=100
對於100%數據1<=n<=1000

輸出格式

輸出一個整數,表示權值的最大值。

樣例

樣例輸入1

8 5
100 2
2 3
79 2
4 5
109 3
6 7 8
100 0
100 0
100 0
101 0
108 0

樣例輸出1

518


My Solution

id序列樹形dp!!!

神秘!

const int maxn=1001;
int d[maxn];               -------->WA!!!!

int d[1001];                -------->AC!!!!

於是我改成了

const int maxn=1010;
int d[maxn];

AC!!!

C++基本的東西還要多學

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<vector>
 5
using namespace std; 6 #define inf 0x3f3f3f3f 7 8 inline int read(){ 9 int re=0; 10 char ch; 11 bool flag=0; 12 while((ch=getchar())!=-&&(ch<0||ch>9)); 13 ch==-?flag=1:re=ch-0; 14 while((ch=getchar())>=0&&ch<=9) re=(re<<1)+(re<<3)+ch-0; 15 return flag?-re:re; 16 } 17 18 struct edge{ 19 int to,next; 20 edge(int to=0,int next=0): 21 to(to),next(next){} 22 }; 23 24 const int maxn=1010; 25 26 vector<edge> edges; 27 int n,m; 28 int head[maxn]; 29 int w[maxn],num[maxn]; 30 int dp[maxn][maxn]; 31 int id[maxn],count[maxn],q=0; 32 int root=1; 33 int cnt=0; 34 int ans=-inf; 35 36 inline void add_edge(int from,int to){ 37 edges.push_back(edge(to,head[from])); 38 head[from]=++cnt; 39 } 40 41 void init(){ 42 n=read(); m=read(); 43 edges.push_back(edge(0,0)); 44 for(int i=1;i<=n;i++){ 45 w[i]=read(); 46 num[i]=read(); 47 for(int j=1;j<=num[i];j++){ 48 int to=read(); 49 add_edge(i,to); 50 } 51 } 52 } 53 54 void dfs(int x){ 55 id[++q]=x; 56 count[x]=1; 57 for(int ee=head[x];ee;ee=edges[ee].next){ 58 dfs(edges[ee].to); 59 count[x]+=count[edges[ee].to]; 60 } 61 } 62 63 void solve(){ 64 memset(dp,-127,sizeof dp); 65 dfs(root); 66 for(int i=1;i<=n;i++){ 67 dp[i][0]=0; 68 dp[i][1]=w[id[i]]; 69 } 70 for(int i=n-1;i>0;i--) 71 for(int j=1;j<=m;j++) 72 dp[i][j]=max(dp[i+1][j-1]+w[id[i]],dp[i+count[id[i]]][j]); 73 for(int i=1;i<=m;i++) 74 ans=max(ans,dp[1][i]); 75 printf("%d\n",max(ans,0)); 76 } 77 78 int main(){ 79 //freopen("temp.in","r",stdin); 80 init(); 81 solve(); 82 return 0; 83 }


於是他走了 就像他沒有來過一樣

 

[vijos 1642]班長的任務 [樹形dp]