選課(洛谷_2014)——樹形dp
阿新 • • 發佈:2017-08-26
char i++ www. fin 位置 pan main define stream
我是來復習一下樹形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