• hdu 1561 树形dp


    又一道树形dp,发现其实树形dp长得都挺像的。

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 using namespace std;
     5 
     6 const int INF = -9999999;
     7 const int N = 201;
     8 int dp[N][N];
     9 int head[N];
    10 int value[N];
    11 int n, m, e;
    12 
    13 void init()
    14 {
    15     e = 0;
    16     memset( head, -1, sizeof(head) );
    17 }
    18 
    19 struct Edge
    20 {
    21     int v, next;
    22 } edge[N];
    23 
    24 void addEdge( int u, int v )
    25 {
    26     edge[e].v = v;
    27     edge[e].next = head[u];
    28     head[u] = e++;
    29 }
    30 
    31 void dfs( int u )
    32 {
    33     dp[u][1] = value[u];
    34     for ( int i = 2; i <= m + 1; i++ )
    35     {
    36         dp[u][i] = INF;
    37     }
    38     for ( int i = head[u]; i != -1; i = edge[i].next )
    39     {
    40         int v = edge[i].v;
    41         dfs(v);
    42         for ( int j = m + 1; j > 1; j-- )
    43         {
    44             for ( int k = 1; k < j; k++ )
    45             {
    46                 dp[u][j] = max( dp[u][j], dp[u][j - k] + dp[v][k] );
    47             }
    48         }
    49     }
    50 }
    51 
    52 int main ()
    53 {
    54     while ( scanf("%d%d", &n, &m) != EOF )
    55     {
    56         if ( n == 0 && m == 0 ) break;
    57         init();
    58         value[0] = 0;
    59         for ( int i = 1; i <= n; i++ )
    60         {
    61             int tmp;
    62             scanf("%d%d", &tmp, value + i);
    63             addEdge( tmp, i );
    64         }
    65         dfs(0);
    66         printf("%d
    ", dp[0][m + 1]);
    67     }
    68     return 0;
    69 }
  • 相关阅读:
    树的遍历
    字符串转化到实数
    redis笔记_源码_跳表skiplist
    《parsing techniques》中文翻译和正则引擎解析技术入门
    sublime3 Package Control和 中文安装
    python基础——字典dict
    python基础1
    pandas入门总结1
    numpy入门总结2
    numpy入门总结1
  • 原文地址:https://www.cnblogs.com/huoxiayu/p/4657506.html
Copyright © 2020-2023  润新知