【模板】多叉转二叉
网上查多叉转二叉好处就是好实现(好打代码)?!
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; int dp[1001][1001],c[1001][1001],v[10001]; int Max(int X,int Y){ return X>Y ? X : Y; } int dfs(int root,int sy){ if(root==0||sy==0){ dp[root][sy]=0; return 0; } if(dp[root][sy]!=-1) return 0; dp[root][sy]=0; for(int i=0;i<sy;i++){ dfs(c[root][0],i); dfs(c[root][1],sy-i-1); dp[root][sy]=Max(dp[root][sy],dp[c[root][0]][i]+dp[c[root][1]][sy-i-1]+v[root]); } dfs(c[root][1],sy); dp[root][sy]=Max(dp[root][sy],dp[c[root][1]][sy]); } int main(){ memset(dp,-1,sizeof(dp)); int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){ int x; scanf("%d%d",&x,&v[i]); if(c[x][0]==0) c[x][0]=i; else{ int j=c[x][0]; while(c[j][1]) j=c[j][1]; c[j][1]=i; } } dfs(c[0][0],m); printf("%d",dp[c[0][0]][m]); }

浙公网安备 33010602011771号