题意:

n个城堡,每个有一定的财富,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡,求应攻克哪m个城堡,获得最大财富。

分析:dp[i][j],以i为根的子树,攻克j个城堡,获得的最大财富,把0看做树的根节点

#include <map>
#include <set>
#include <list>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <string>
#include <cctype>
#include <complex>
#include <cassert>
#include <utility>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int,int> PII;
typedef long long ll;
#define lson l,m,rt<<1
#define pi acos(-1.0)
#define rson m+1,r,rt<<11
#define All 1,N,1
#define read freopen("in.txt", "r", stdin)
const ll INFll = 0x3f3f3f3f3f3f3f3fLL;
const int INF= 0x7ffffff;
const int mod = ;
vector<int>e[];
int dp[][],n,m;
void dfs(int root){
for(int i=;i<e[root].size();++i){
int son=e[root][i];
dfs(son);
for(int j=m;j>=;--j)
for(int k=;k<j;++k)
dp[root][j]=max(dp[root][j],dp[root][j-k]+dp[son][k]);
}
}
int main()
{
while(~scanf("%d%d",&n,&m)){
if(n==&&m==)break;
int a,b;
memset(dp,,sizeof(dp));
for(int i=;i<=n;++i)
e[i].clear();
for(int i=;i<=n;++i){
scanf("%d%d",&a,&b);
dp[i][]=b;
e[a].push_back(i);
}
m++;
dfs();
printf("%d\n",dp[][m]);
}
return ;
}

最新文章

  1. Windows下用python编写简单GUI程序的方法
  2. Thread.Sleep in WinRT
  3. servlet的生命周期与运行时的线程模型
  4. Python可变参数
  5. Informatica Powercenter学习笔记
  6. Java虚拟机工作原理详解 ( 二 )
  7. AVG()和to_date()函数的使用
  8. UVa 11582 (快速幂取模) Colossal Fibonacci Numbers!
  9. IOS - IOS之同步请求、异步请求、GET请求、POST请求
  10. 【Unity编程】四元数(Quaternion)与欧拉角
  11. 【POJ】2115 C Looooops(扩欧)
  12. nginx部署~dotnetCore+mvc网站502
  13. Gradle打jar包命令
  14. 启动fiddler导致浏览器无法上网的解决方法
  15. mysql数据库卸载和安装
  16. Centos yum国内源及配置含义
  17. C++重载操作符自增自减
  18. C++学习(一)之Visual Studio安装以及首次使用
  19. python查找字符串 函数find() 用法
  20. 【jQuery】jquery.metadata.js验证失效

热门文章

  1. 使用eclipse生成文档(javadoc)
  2. 3123 高精度练习之超大整数乘法 - Wikioi
  3. JVM内存区域模型
  4. kill 进程卡住,超时kill方法
  5. 团体程序设计天梯赛-练习集L1-002. 打印沙漏
  6. textarea中限制输入字符长度
  7. hdu 3646
  8. kafka.network.SocketServer分析
  9. 如何保护 .NET 应用的安全?
  10. 学习笔记:shared_ptr陷阱