Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
AC 疏星背包的时候要从后往前更新,否则一个点会被一个儿子更新两遍#include<stdio.h> #include<stdlib.h> #include<string.h> #define s son[x][i] typedef struct abcd{int to;abcd*next;} abcd;abcd*head[110]; void add(int x,int y){abcd*temp=(abcd*)malloc(sizeof(abcd));temp->to=y;temp->next=head[x];head[x]=temp;} int max(int x,int y){return x>y?x:y;} int f[110][210][2];//f[i][j][0]=x表示从i点开始走j步回到i点能吃到最多苹果,1是不回来; int a[110],fa[110],son[110][110],mark[110]; int ans; int n,k; void build_tree(int x) { abcd*temp; mark[x]=1; for(temp=head[x];temp;temp=temp->next)if(!mark[temp->to])build_tree(temp->to),fa[temp->to]=x,son[x][++son[x][0]]=temp->to; } void Treedp(int x) { int i,j,l; f[x][0][0]=a[x]; for(i=1;s;i++) { Treedp(s); for(j=k;j>=0;j--)for(l=k;l>=0;l--) { if(j+l>=k)continue; f[x][j+l+1][1]=max(f[x][j+l+1][1],f[x][j][0]+f[s][l][1]); if(j+l+2>k)continue; f[x][j+l+2][0]=max(f[x][j+l+2][0],f[x][j][0]+f[s][l][0]); f[x][j+l+2][1]=max(f[x][j+l+2][1],f[x][j][1]+f[s][l][0]); } } f[x][0][1]=a[x]; } int main() { int i,j,x,y; while(scanf("%d",&n)!=EOF) { memset(head,0,sizeof(head)); memset(f,0xef,sizeof(f)); memset(son,0,sizeof(son)); memset(mark,0,sizeof(mark)); ans=0; scanf("%d",&k); for(i=1;i<=n;i++)scanf("%d",&a[i]); for(i=1;i<n;i++)scanf("%d%d",&x,&y),add(x,y),add(y,x); build_tree(1); Treedp(1); for(i=0;i<=k;i++)ans=max(ans,max(f[1][i][0],f[1][i][1])); printf("%d\n",ans); } } C的代码,略原始,凑活看吧 Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator