• HDOJ树形DP专题之The more, The Better


    题目链接

    这题要用左二子,右兄弟的存储结构来存树(附加一个结点0,将森林连成树),然后就是在二叉树上DP。

    View Code
     1 #include <stdio.h>
     2 #include <memory.h>
     3 #define MAX(a,b) ((a)>(b)?(a):(b))
     4 #define N 205
     5 int son[N],bro[N],w[N],n,m;
     6 int c[N][N];
     7 void Insert(int u,int fa,int x)
     8 {
     9   w[u]=x;
    10   if(son[fa]==-1) son[fa]=u;
    11   else  bro[u]=bro[son[fa]],bro[son[fa]]=u;
    12 }
    13 int dp(int r,int k)
    14 {
    15   int i,ret;
    16   if(r==-1 || !k)  return 0;
    17   if(c[r][k]!=-1) return c[r][k];
    18   ret=dp(bro[r],k);
    19   for(i=0;i<k;i++) ret=MAX(ret,w[r]+dp(son[r],i)+dp(bro[r],k-1-i));
    20   return c[r][k]=ret;
    21 }
    22 int main()
    23 {
    24   int i,fa,x;
    25   while(~scanf("%d%d",&n,&m)&&n)
    26   {
    27     memset(son,-1,sizeof(son));
    28     memset(bro,-1,sizeof(bro));
    29     for(i=1;i<=n;i++)
    30     {
    31       scanf("%d%d",&fa,&x);
    32       Insert(i,fa,x);
    33     }
    34     w[0]=0;
    35     memset(c,-1,sizeof(c));
    36     printf("%d\n",dp(0,m+1));
    37   }
    38   return 0;
    39 }
  • 相关阅读:
    计数排序【代码】
    快速排序【代码】
    基于最大堆实现最大优先队列
    Spring入门(1)
    AJAX初步理解
    选择器
    Hibernate的映射
    Hibernate配置(2)
    查看mysql的安装路径
    Hibernate入门(1)
  • 原文地址:https://www.cnblogs.com/algorithms/p/2473039.html
Copyright © 2020-2023  润新知