码迷,mamicode.com
首页 > 其他好文 > 详细

codevs 1378 选课 (树形DP)

时间:2016-05-13 23:18:11      阅读:289      评论:0      收藏:0      [点我收藏+]

标签:

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,m,son[310][2],f[310][310],v[310],ans;
int init()
{
    int x=0;char s;s=getchar();
    while(s<0||s>9)s=getchar();
    while(s>=0&&s<=9){x=x*10+s-0;s=getchar();}
    return x;
}
int DP(int p,int x)
{
    if(x==0||(p==0&&x<m+1))return 0;
    if(f[p][x])return f[p][x];
    f[p][x]=v[p];
    for(int i=1;i<=x;i++)
      {
        f[p][x]=max(f[p][x],DP(son[p][1],x-i)+v[p]+DP(son[p][2],i-1));
        f[p][x]=max(f[p][x],DP(son[p][2],i));
      }
    return f[p][x];
}
int main()
{
    n=init();m=init();
    int x,y;
    for(int i=1;i<=n;i++)
      {
          x=init();y=init();
        v[i]=y;
          if(son[x][1]==0)//左孩子空 直接放上 
            {
                son[x][1]=i;
                continue;
          }
        int fa=son[x][1];//左孩子不空 i要放到左孩子的右孩子上 
        while(son[fa][2])fa=son[fa][2];//一直放到空的地方 
          son[fa][2]=i;
      }
    printf("%d\n",DP(0,m+1));//多加一个节点0 把森林变为树 同时科目数+1 
}

 

codevs 1378 选课 (树形DP)

标签:

原文地址:http://www.cnblogs.com/yanlifneg/p/5491355.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!