标签:ret 一个 了解 log == inline www. void line
我是来复习一下树形dp的
这题,需要了解——左儿子右兄弟——也就是说,这是一个多叉树转二叉树的方法,儿子位置不变,兄弟的位置变成右儿子
然后就和二叉苹果树差不多了。
#include<iostream> #include<cstdio> #define max(a,b) a>b?a:b using namespace std; inline int read(){ int t=1,num=0;char c=getchar(); while(c>‘9‘||c<‘0‘){if(c==‘-‘)t=-1;c=getchar();} while(c>=‘0‘&&c<=‘9‘){num=num*10+c-‘0‘;c=getchar();} return num*t; } struct note{int l,r;}e[310]; int n,m,w[310],a[310],f[310][310]; void dp(int x,int c){ if(c<=0||x==0||f[x][c]!=0)return; dp(e[x].r,c); f[x][c]=max(f[x][c],f[e[x].r][c]); for(int i=0;i<c;i++){ dp(e[x].l,i);dp(e[x].r,c-i-1); f[x][c]=max(f[x][c],f[e[x].l][i]+f[e[x].r][c-i-1]+w[x]); } } int main() { n=read();m=read(); for(int i=1;i<=n;i++){ int x=read();w[i]=read(); if(!a[x])e[x].l=i; else e[a[x]].r=i; a[x]=i; } dp(e[0].l,m);printf("%d\n",f[e[0].l][m]); return 0; }
本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。
标签:ret 一个 了解 log == inline www. void line
原文地址:http://www.cnblogs.com/Yzyet/p/7436434.html