1. 程式人生 > >選課(洛谷_2014)——樹形dp

選課(洛谷_2014)——樹形dp

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