この問題に対するRIV川ソリューション

この問題に対するRIV川ソリューション

この質問の練習に似た、来た:
私たちは、どのようなトピックを変換することができます:
0:00合計に元のフルコストを取得し、それはコストがどのくらいのk個の製材所のより多くの削減を構築するために、ルックアップ、
設定I [F(\を\):] [J] [ k]の最大値は、iノードのコストを低減するために、最寄りの製材所からの距離iは内(祖父母)であり、kログフィールドの組み込みサブツリー:

我々は各点Iを検討Xの製材所の寄与、最大k個の製材値を選択:
マスター方程式:

for(int v=0;v<=d;++v) for(int j=min(siz[x],k);j>=0;--j) for(int o=0;o<=min(j,siz[u]);++o) f[x][v][j]=max(f[x][v][j],f[x][v][j-o]+max(f[u][v+1][o],f[u][0][o]));

中:
\(F [X] [V] [J] = MAX(F [X] [V]、[J]、F [X] [V] [ジョー] + MAX(F [U] [v + 1] [O]、F [U] [0] [O]))\)

\(F [X] [V ] [ジョー] + \) 継承前サブツリーを代表します、

\([U] [V fは + 1] [O] \) uは、製材をアップロードの構築に寄与するV指します

\(F [U] [0 ] [O] \) Uは製材新しい時点で

合計コード:

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=106,K=52;
int n,k,cnt=0,t1,t2,t3,fa[N][N],siz[N];
int q,f[N][N][K],w[N],sum=0,sumw[N],head[N];
struct edge{int nxt,to,w;}e[N<<1];
inline void add(int u,int v,int w){e[++cnt].nxt=head[u],e[cnt].to=v,e[cnt].w=w,head[u]=cnt;}
inline int read(){
   int T=0,F=1; char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-') F=-1; ch=getchar();}
   while(ch>='0'&&ch<='9') T=(T<<3)+(T<<1)+(ch-48),ch=getchar();
   return F*T;
}
void dfs(int x,int ffa,int d){
     int u; fa[x][0]=x,fa[x][1]=ffa,f[x][0][1]=sumw[x]*w[x],f[x][1][0]=sumw[ffa]*w[x],siz[x]=1,sum+=sumw[x]*w[x]; 
     for(int i=2;i<=d;++i) fa[x][i]=fa[fa[x][1]][i-1],f[x][i][0]=sumw[fa[x][i]]*w[x];
     for(int i=head[x];i;i=e[i].nxt){
         u=e[i].to,sumw[u]=sumw[x]+e[i].w,dfs(u,x,d+1),siz[x]+=siz[u];
         for(int v=0;v<=d;++v) for(int j=min(siz[x],k);j>=0;--j) for(int o=0;o<=min(j,siz[u]);++o) f[x][v][j]=max(f[x][v][j],f[x][v][j-o]+max(f[u][v+1][o],f[u][0][o]));
      }
}
int main(){
    n=read()+1,k=read()+1; memset(f,0xc0,sizeof(f));
    for(int i=2;i<=n;++i) t1=read(),t2=read()+1,t3=read(),add(t2,i,t3),w[i]=t1;
    dfs(1,0,1),q=0;
    for(int i=1;i<=k;++i) q=max(q,f[1][0][i]);
    printf("%d\n",sum-q);
    return 0;
} 

おすすめ

転載: www.cnblogs.com/ljk123-de-bo-ke/p/11694349.html