题解:P8916 [DMOI-R2] 暗号
P8916 [DMOI-R2] 暗号
体现了一种费用提前计算的思想。明显考虑
最后需要算上当前点
时间复杂度
:::info[代码]
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
template<class T>void Max(T &x,T y) { if (y>x) x=y; }
const int N=310;
int n;
int h[N],e[N<<1],ne[N<<1],idx;
void add(int u,int v) { e[idx]=v,ne[idx]=h[u],h[u]=idx++; }
int w[N];
int dep[N];
ll f[N][N][N][2];
void dfs(int u,int fat)
{
dep[u]=dep[fat]+1;
for (int _=h[u];_!=-1;_=ne[_])
{
int v=e[_]; if (v==fat) continue; dfs(v,u);
for (int i=0;i<=dep[u];i++)
{
for (int j=0;i+j<=dep[u];j++)
{
f[u][i][j][0]+=max(f[v][i][j][1],f[v][i+1][j][0]);
f[u][i][j][1]+=max(f[v][i][j][0],f[v][i][j+1][1]);
}
}
}
for (int i=0;i<=dep[u];i++)
{
for (int j=0;i+j<=dep[u];j++)
{
f[u][i][j][0]+=1ll*(i+1)*w[u];
f[u][i][j][1]+=1ll*(j+1)*w[u];
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
cin >> n;
memset(h,-1,sizeof(h));
for (int i=1;i<n;i++)
{
int u,v; cin >> u >> v;
add(u,v), add(v,u);
}
for (int i=1;i<=n;i++) cin >> w[i];
dep[0]=-1; dfs(1,0);
cout << max(f[1][0][0][0],f[1][0][0][1]) << "\n";
return 0;
}
:::