1 条题解
-
0
C :
#include <stdio.h> #include <stdlib.h> #include <math.h> int n, q; struct ben { int to, last, val, dq; }a[205]; int f[205][205]; int cnt = 1; int head[205]; void add(int x, int y, int num) { a[cnt].to = y; a[cnt].last = head[x]; a[cnt].dq = x; a[cnt].val = num; head[x]=cnt++; } void search(int dq, int fa) { for(int i = head[dq];i >0; i = a[i].last) { int b = a[i].to; if(b == fa)continue; f[b][1]=a[i].val; search(b,dq); for(int j = q;j >= 1; j--) { for(int k = 0;k <= j; k++) { if((j != 1 && j != k) || dq == 1) { f[dq][j] = fmax(f[dq][j],f[b][k]+f[dq][j-k]); } } } } } int main() { scanf("%d%d",&n,&q); for(int i = 1;i <= n; i++) { head[i]=-1; } for(int i = 1;i < n; i++) { int x, y, num; scanf("%d%d%d",&x,&y,&num); add(x,y,num); add(y,x,num); } search(1,0); printf("%d\n",f[1][q]); return 0; }
C++ :
#include<iostream> #include<cstring> #include<cstdio> using namespace std; struct tree { int lc,rc,data; }; const int maxn=101; int n,q,a[maxn][maxn],f[maxn][maxn]; bool flag[maxn]={0}; tree t[maxn]; void init(); void buildtree(int); int dp(int,int); int main() { //freopen("apple11.in","r",stdin); init(); buildtree(1); cout<<dp(1,q)<<endl; return 0; } void init() { cin>>n>>q; q++;//q条树枝需要q+1个点 memset(t,0,sizeof(t)); memset(a,-1,sizeof(a));//有些树枝可能没有苹果 memset(f,-1,sizeof(f));// memset(flag,0,sizeof(flag)); for(int i=1;i<n;i++) { int x,y,z; cin>>x>>y>>z; a[x][y]=a[y][x]=z; } } void buildtree(int x) { flag[x]=true;//当前点进树 for(int i=1;i<=n;i++) { if(!flag[i] && a[x][i]!=-1)//找和x点直接相连且不在树上的点 { if(t[x].lc==0) t[x].lc=i;//如果x没有坐子树,则i为其左儿子 else t[x].rc=i;//如果有左儿子则为其右儿子,因为和x相连的点只有2个或者没有 t[i].data=a[x][i];//i点的值域记录的是i到其父亲节点的苹果数 buildtree(i);//对i点递归建树 } } } int dp(int x,int y)//表示以下x为根,保留y个节点 { if(f[x][y]!=-1)return f[x][y];//如果f[x][y]有值则不用再计算 if(x==0||y==0) { f[x][y]=0;//x=0表示该节点没有子树,是叶节点,y=0表示没有节点 return f[x][y]; } f[x][y]=0; for(int i=0;i<=y-1;i++) { int ls=dp(t[x].lc,i);//x的左儿子为根,保留i个节点 int rs=dp(t[x].rc,y-1-i);//x的右儿子为根,保留y-1-i个节点,因为x节点必须保留,所以y-1 if(f[x][y]<ls+rs) f[x][y]=ls+rs; } f[x][y]+=t[x].data; return f[x][y]; }
Pascal :
var lc,rc:array[-1..101] of longint; vis:array[0..101] of boolean; f,d:array[-10..101,-10..101] of longint; v:array[-1..101,0..3] of longint; ap:array[-1..101] of longint; n,q,i,a,b,c:longint; procedure treedp(x,tot:longint); var ans,i:longint; begin if f[x,tot]>-1 then exit; if x=-1 then begin f[x,tot]:=0; exit; end; if tot=0 then begin f[x,tot]:=0; exit; end; ans:=0; for i:=0 to tot-1 do begin treedp(lc[x],i); treedp(rc[x],tot-i-1); if f[lc[x],i]+f[rc[x],tot-i-1]+ap[x]>ans then ans:=f[lc[x],i]+f[rc[x],tot-i-1]+ap[x]; end; f[x,tot]:=ans; end; procedure build(x:longint); var i:longint; begin vis[x]:=true; for i:=1 to v[x,0] do if not vis[v[x,i]] then if lc[x]=-1 then begin lc[x]:=v[x,i]; ap[lc[x]]:=d[x,lc[x]]; build(lc[x]); end else begin rc[x]:=v[x,i]; ap[rc[x]]:=d[x,rc[x]]; build(rc[x]); end; end; begin readln(n,q); for i:=1 to n-1 do begin readln(a,b,c); inc(v[a,0]); v[a,v[a,0]]:=b; inc(v[b,0]); v[b,v[b,0]]:=a; d[a,b]:=c; d[b,a]:=c; end; fillchar(lc,sizeof(lc),255); fillchar(rc,sizeof(rc),255); fillchar(f,sizeof(f),255); fillchar(vis,sizeof(vis),false); build(1); treedp(1,q+1); writeln(f[1,q+1]); end.
- 1
信息
- ID
- 840
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者