[vijos 1642]班長的任務 [樹形dp]
阿新 • • 發佈:2017-05-20
c++ 編程 輸出 不能 push_back from || logs 由於 接下來2*n行,每兩行代表一個同學的信息(如果這位同學沒有子節點,就只有一行)。
背景
十八居士的畢業典禮(1)
描述
福州時代中學2009屆十班同學畢業了,於是班長PRT開始籌辦畢業晚會,但是由於條件有限,可能每個同學不能都去,但每個人都有一個權值,PRT希望來的同學們的權值總和最大。
十班有一個周密的電話通知網絡,它其實就是一棵樹,根結點為班長PRT,由她來負責通知她的下線(也就是兒子節點),下線們繼續通知自己的下線(不一定每個下線都要通知),任何人都可以不去:”
為了使權值總和最大,班長想安排一下人,但是人數很多,人腦是難以應付的,所以她找到十八居士,讓他編程用電腦解決。
格式
輸入格式
輸入第一行兩個整數n,m表示有n位同學,至多只能去m位同學。(1<=m<=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> 5using 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]