选课(洛谷_2014)——树形dp
Posted Yzyet
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了选课(洛谷_2014)——树形dp相关的知识,希望对你有一定的参考价值。
我是来复习一下树形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同意,禁止转载,侵权者必究。
以上是关于选课(洛谷_2014)——树形dp的主要内容,如果未能解决你的问题,请参考以下文章