题目
分析
- 暴力分还是很足的 50
- 正解是一个树形DP
- 对于一个根节点来说,可能有多种分配情况需要一个枚举就好了
- 加一个记忆化加快时间
代码
1 #include<iostream>
2 using namespace std;
3 struct sb
4 {
5 int val,f,m;
6 }a[1001];
7 int v[1001][1001],f[1001][1001];
8 int dp(int x,int sum)
9 {
10 if (v[x][sum]) return f[x][sum];
11 if (!sum) return f[x][sum]=0;
12 if (!x) return f[x][sum]=-1e9;
13 if (sum==1) return f[x][sum]=a[x].val;
14 int ans=-1e9;
15 for (int i=0;i<sum;i++)
16 ans=max(ans,a[x].val+dp(a[x].f,i)+dp(a[x].m,sum-i-1));
17 v[x][sum]=1;
18 f[x][sum]=ans;
19 return ans;
20 }
21 int main ()
22 {
23 int n,k;
24 cin>>n>>k;
25 for (int i=2;i<=n;i++)
26 cin>>a[i].val;
27 for (int i=1;i<=n;i++)
28 cin>>a[i].f>>a[i].m;
29 cout<<dp(1,k+1);
30 }