zoukankan      html  css  js  c++  java
  • 邱老师玩游戏(树形DP) UESTC

    邱老师最近在玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中邱老师允许攻克M个城堡并获得里面的宝物。

    但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮邱老师算出要获得尽量多的宝物应该攻克哪M个城堡吗?

    Input
    每个测试实例首先包括2个整数,N,M.(1 <= M <= N <= 200);

    在接下来的N行里,每行包括2个整数,a,b.

    在第 i 行,a 代表要攻克第 i 个城堡必须先攻克第 a 个城堡,如果 a = 0 则代表可以直接攻克第 i 个城堡。b 代表第 i 个城堡的宝物数量, b >= 0。

    当N = 0, M = 0输入结束。

    Output
    对于每个测试实例,输出一个整数,代表邱老师攻克M个城堡所获得的最多宝物的数量。

    Sample Input
    3 2
    0 1
    0 2
    0 3
    7 4
    2 2
    0 1
    0 4
    2 1
    7 1
    7 6
    2 2
    0 0
    Sample Output
    5
    13

    //第一次做树形DP还是比较有意思的,dp[i][j] 代表在i 节点选 j 个的最大收益,滚动数组省空间,还有就是 m++ 很关键,因为0节点算进去了

     1 #include <bits/stdc++.h>
     2 using namespace std;
     3 #define MX 205
     4 
     5 int n,m;
     6 int dp[MX][MX];
     7 int b[MX];
     8 int vis[MX];
     9 vector<int> tree[MX];
    10 
    11 void dfs(int x)
    12 {
    13     if (vis[x])return ;
    14     vis[x]=1;
    15     dp[x][1]=b[x];
    16     for (int i=0;i<tree[x].size();i++)
    17     {
    18         int v = tree[x][i];
    19         dfs(v);
    20         for (int j=m;j>=0;j--)
    21         {
    22             for (int k=0;k<j;k++)
    23                 dp[x][j] = max(dp[x][j],dp[v][k]+dp[x][j-k]);
    24         }
    25     }
    26 }
    27 
    28 int main()
    29 {
    30     while (scanf("%d%d",&n,&m)!=EOF)
    31     {
    32         if (n==0&&m==0) break;
    33         m++;
    34         for (int i=0;i<=n;i++) tree[i].clear();
    35         memset(vis,0,sizeof(vis));
    36         memset(dp,0,sizeof(dp));
    37         for (int i=1;i<=n;i++)
    38         {
    39             int a;
    40             scanf("%d%d",&a,&b[i]);
    41             tree[a].push_back(i);
    42         }
    43         dfs(0);
    44         printf("%d
    ",dp[0][m]);
    45     }
    46     return 0;
    47 }
    View Code
  • 相关阅读:
    数据类型装换
    变量及数据类型
    27 网络通信协议 udp tcp
    26 socket简单操作
    26 socket简单操作
    14 内置函数 递归 二分法查找
    15 装饰器 开闭原则 代参装饰器 多个装饰器同一函数应用
    12 生成器和生成器函数以及各种推导式
    13 内置函数 匿名函数 eval,exec,compile
    10 函数进阶 动态传参 作用域和名称空间 函数的嵌套 全局变量
  • 原文地址:https://www.cnblogs.com/haoabcd2010/p/6930678.html
Copyright © 2011-2022 走看看