1 条题解
-
1
#include<bits/stdc++.h> using namespace std; int n,m,k,s,t,ans,tot,ans1,ans2,ans3,p; int a[305],b[305],nxt[305],v[305]; int f[305][305]; void add(int s,int t){ b[++tot]=t; nxt[tot]=a[s]; a[s]=tot; } void dfs(int x){ f[x][1]=v[x];//仅选x号节点,最大得分为v[x] int k=a[x]; while (k){ int y=b[k]; dfs(y); for (int i=m;i>=1;--i)//之前的节点中选i门课 for (int j=1;i+j<=m;++j)//当前节点选j门课 f[x][i+j]=max(f[x][i+j],f[x][i]+f[y][j]); k=nxt[k]; } } int main() { memset(f,-0x3f,sizeof(f)); cin>>n>>m; for (int i=1;i<=n;++i){ cin>>s>>t; v[i]=t; if (s>0) add(s,i); else add(n+1,i); } ++n;++m; dfs(n); cout<<f[n][m]<<endl; }
- 1
信息
- ID
- 368
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 1
- 标签
- 递交数
- 34
- 已通过
- 27
- 上传者