2 条题解
-
0
by hansang:
#include<bits/stdc++.h> using namespace std; const int N=510; int f[N][N][2], n, a[N]; vector<int> G[N]; void dfs(int x){ f[x][0][0]=0; f[x][0][1]=a[x]; for(int y: G[x]){ dfs(y); for(int i=n; i>=0; i--){ for(int j=i; j>=0; j--){ f[x][i][0]=max(f[x][i][0], f[x][j][0]+max(f[y][i-j][1], f[y][i-j][0])); if(i-j>=1) f[x][i][1]=max(f[x][i][1], f[x][j][1]+f[y][i-j-1][1]); f[x][i][1]=max(f[x][i][1], f[x][j][1]+f[y][i-j][0]); } } } } void work(){ int m; scanf("%d%d", &n, &m); for(int i=1; i<=n; i++){ int x=i, y; scanf("%d%d", &a[i], &y); G[y].push_back(x); } memset(f, -0x3f, sizeof(f)); a[0]=0; dfs(0); for(int i=n; i>=0; i--){ if(f[0][i][0]<m) continue; printf("%d\n", i); return ; } printf("-1\n"); } int main(){ work(); return 0; } -
0
by hansang:
#include<bits/stdc++.h> using namespace std; const int N=510; int f[N][N][2], n, a[N]; vector<int> G[N]; void dfs(int x){ f[x][0][0]=0; f[x][0][1]=a[x]; for(int y: G[x]){ dfs(y); for(int i=n; i>=0; i--){ for(int j=i; j>=0; j--){ f[x][i][0]=max(f[x][i][0], f[x][j][0]+max(f[y][i-j][1], f[y][i-j][0])); if(i-j>=1) f[x][i][1]=max(f[x][i][1], f[x][j][1]+f[y][i-j-1][1]); f[x][i][1]=max(f[x][i][1], f[x][j][1]+f[y][i-j][0]); } } } } void work(){ int m; scanf("%d%d", &n, &m); for(int i=1; i<=n; i++){ int x=i, y; scanf("%d%d", &a[i], &y); G[y].push_back(x); } memset(f, -0x3f, sizeof(f)); a[0]=0; dfs(0); for(int i=n; i>=0; i--){ if(f[0][i][0]<m) continue; printf("%d\n", i); return ; } printf("-1\n"); } int main(){ work(); return 0; }
- 1
信息
- ID
- 2317
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 9
- 标签
- 递交数
- 20
- 已通过
- 3
- 上传者