http://acm.hdu.edu.cn/showproblem.php?pid=1561

ACboy很喜欢玩一种战略游戏,在一个地图上,有N座城堡,每座城堡都有一定的宝物,在每次游戏中ACboy允许攻克M个城堡并获得里面的宝物。但由于地理位置原因,有些城堡不能直接攻克,要攻克这些城堡必须先攻克其他某一个特定的城堡。你能帮ACboy算出要获得尽量多的宝物应该攻克哪M个城堡吗?

upd:https://www.cnblogs.com/luyouqi233/p/12403258.html 和它一样,换了种代码和理解写,更加好看了。

O(n*m^2)的复杂度相信大家已经都会了。

(代码注释区域的dfs)

这里介绍一种O(n*m)的算法,参考https://www.cnblogs.com/Patt/p/5642181.html与徐持衡的论文。

设dp[i][j]为取根节点到i节点路径上的所有点,再从这条路径的左边上和i的子树上取j体积的点的最大价值。最后答案为dp[0][m]。

(看起来这个定义没法想,但是徐的论文给的方法是泛化物品合并……这个方法到现在还没有看懂。)

对于所谓“路径的左边”可理解为dfs序比i小且不在这条路径上的合法路径。

(更饶了*2)

有一个看起来很妙的方程dp[u][j]=max(dp[u][j],dp[v][j-1]);

当然在这之前每个儿子我们都需要更新,dp[v][j]=dp[u][j]+w[v],然后把v递归跑一遍。

(思考为什么不是dp[u][j+1])

(卡了很久思索出了结果,实际很简单,对dp[u][j]状态它根本没选择v及其子树的点,所以初始时dp[v][j]选择的j个点正好是dp[u][j]的j个点)

#include<cstdio>
#include<iostream>
#include<vector>
#include<queue>
#include<cstring>
#include<algorithm>
#include<map>
using namespace std;
const int N=;
inline int read(){
int X=,w=;char ch=;
while(!isdigit(ch)){w|=ch=='-';ch=getchar();}
while(isdigit(ch))X=(X<<)+(X<<)+(ch^),ch=getchar();
return w?-X:X;
}
struct node{
int to,nxt;
}e[N];
int cnt,head[N];
int n,m,w[N],dp[N][N];
inline void add(int u,int v){
e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt;
}
/*void dfs(int u){
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
dfs(v);
for(int j=m;j>=2;j--){//保证无后效性
for(int k=1;k<j;k++){
dp[u][j]=max(dp[u][j],dp[u][k]+dp[v][j-k]);
}
}
}
}*/
void dfs(int u,int c){
if(c<=)return;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
for(int j=;j<c;j++){
dp[v][j]=dp[u][j]+w[v];
}
dfs(v,c-);
for(int j=;j<=c;j++){
dp[u][j]=max(dp[u][j],dp[v][j-]);
}
}
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF&&n+m){
n++;cnt=;
memset(head,,sizeof(head));
for(int i=;i<n;i++){
int u=read()+,v=i+;
w[v]=read();
add(u,v);
}
for(int i=;i<=n;i++){
for(int j=;j<=m;j++){
dp[i][j]=w[i];
}
}
dfs(,m);
printf("%d\n",dp[][m]);
}
return ;
}

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

HDU1561:The more, The Better——题解的更多相关文章

  1. BZOJ2427:[HAOI2010]软件安装——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=2427 https://www.luogu.org/problemnew/show/P2515 现在 ...

  2. 2016 华南师大ACM校赛 SCNUCPC 非官方题解

    我要举报本次校赛出题人的消极出题!!! 官方题解请戳:http://3.scnuacm2015.sinaapp.com/?p=89(其实就是一堆代码没有题解) A. 树链剖分数据结构板题 题目大意:我 ...

  3. noip2016十连测题解

    以下代码为了阅读方便,省去以下头文件: #include <iostream> #include <stdio.h> #include <math.h> #incl ...

  4. BZOJ-2561-最小生成树 题解(最小割)

    2561: 最小生成树(题解) Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1628  Solved: 786 传送门:http://www.lyd ...

  5. Codeforces Round #353 (Div. 2) ABCDE 题解 python

    Problems     # Name     A Infinite Sequence standard input/output 1 s, 256 MB    x3509 B Restoring P ...

  6. 哈尔滨理工大学ACM全国邀请赛(网络同步赛)题解

    题目链接 提交连接:http://acm-software.hrbust.edu.cn/problemset.php?page=5 1470-1482 只做出来四道比较水的题目,还需要加强中等题的训练 ...

  7. 2016ACM青岛区域赛题解

    A.Relic Discovery_hdu5982 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Jav ...

  8. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  9. 网络流n题 题解

    学会了网络流,就经常闲的没事儿刷网络流--于是乎来一发题解. 1. COGS2093 花园的守护之神 题意:给定一个带权无向图,问至少删除多少条边才能使得s-t最短路的长度变长. 用Dijkstra或 ...

随机推荐

  1. 【独家】K8S漏洞报告 | 近期bug fix解读&1.9.11主要bug fix汇总

    *内容提要: 1. Kube-proxy长连接优雅断开机制及IPVS模式实现 2. 10/29--11/19 bug fix汇总分析 3. 1.9.11重要bug fix汇总 在本周的跟踪分析中,以1 ...

  2. WEB中间件漏洞--IIS

    1.iis安装 版本 一直下一步,选上iis安装 端口修改 网站目录 通过网站发布目录(发布目录任意),新建index.html页面,可以正常访问 2.iis6.0解析漏洞 (1)文件名解析 IIS在 ...

  3. Windows下PHP安全环境的搭建

    笔者一直在Windows环境下搭建PHP的运行环境,大大小小的运行环境用过不少,从开始的WAMP到后来的XAMPP以及PHPnow.WAMP和XAMPP都是继承mysql apache以及PHP库的运 ...

  4. win10下搭建私链

    首先要下载geth,下载地址:https://gethstore.blob.core.windows.net/builds/geth-windows-amd64-1.7.0-6c6c7b2a.exe ...

  5. POJ 3714 Raid(计算几何の最近点对)

    Description After successive failures in the battles against the Union, the Empire retreated to its ...

  6. Fox and Number Game

    Fox Ciel is playing a game with numbers now. Ciel has n positive integers: x1, x2, ..., xn. She can ...

  7. Alpha发布文案+美工

    文案: Alpha发布文稿 我们是Hello World!团队,下面由我来简要介绍一下我们组的作品,我们组做的是一个飞机射击类游戏,名字叫做空天猎.这个游戏是基于JAVA平台创建的,那么接下来让我给大 ...

  8. html+css基础 - 个人备忘录

    //======================html部分===================// 表现内容<meta http-equiv="Content-Type" ...

  9. FZU.Software Engineering1816 · First Homework -Preparation

    Introduction 041602204 : 我是喜欢狗狗(particularly Corgi & Shiba Inu.)的丁水源 : 我的爱好是音乐.电影.英语(100%!!!!).吉 ...

  10. ACM 第十一天

    多校7题目 GuGuFishtion Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Other ...