[JLOI2015]战争调度

文章目录

  • 题目
  • 题解
  • 代码实现

题目

脸哥最近来到了一个神奇的王国,王国里的公民每个公民有两个下属或者没有下属,这种关系刚好组成一个 n 层的完全二叉树。

公民 i 的下属是 2 * i 和 2 * i +1。最下层的公民即叶子节点的公民是平民,
平民没有下属,最上层的是国王,中间是各级贵族。

现在这个王国爆发了战争,
国王需要决定每一个平民是去种地以供应粮食还是参加战争,
每一个贵族(包括国王自己)是去管理后勤还是领兵打仗。

一个平民会对他的所有直系上司有贡献度,
若一个平民 i 参加战争,他的某个直系上司 j 领兵打仗,
那么这个平民对上司的作战贡献度为 wij。

若一个平民i 种地,他的某个直系上司 j 管理后勤,
那么这个平民对上司的后勤贡献度为 fij,
若 i 和 j 所参加的事务不同,则没有贡献度。

为了战争需要保障后勤,国王还要求不多于 m 个平民参加战争。
国王想要使整个王国所有贵族得到的贡献度最大,并把这件事交给了脸哥。
但不幸的是,脸哥还有很多 deadline 没有完成,他只能把这件事又转交给你。
你能帮他安排吗?

输入格式
第一行两个数 n;m。

接下来 2^(n-1) 行,每行n-1 个数,第 i 行表示编号为 2^(n-1)-1+ i 的平民对其n-1直系上司的作战贡献度,其中第一个数表示对第一级直系上司,即编号为 (2^(n-1)-1+ i)/2 的贵族的作战贡献度 wij,依次往上。

接下来 2^(n-1)行,每行n-1个数,第i行表示编号为 2^(n-1)-1+ i的平民对其n-1个直系上司的后勤贡献度,其中第一个数表示对第一级直系上司,即编号为 (2^(n-1)-1+ i)/2 的贵族的后勤贡献度 fij ,依次往上。

输出格式
一行一个数表示满足条件的最大贡献值

输入输出样例
输入
3 4
503 1082
1271 369
303 1135
749 1289
100 54
837 826
947 699
216 389
输出
6701
说明/提示
对于 100% 的数据,2 <= n <= 10,m <= 2n 1,0 <= wij ;fij <= 2000

题解

首先这道题光输入就难到了一大片人在这里插入图片描述
可以这么输入w[i][j]w[i][j]w[i][j],f[i][j]f[i][j]f[i][j]表示i号叶子节点的第j层长官共同去打仗或种地时的价值


接着题目告诉了是一棵完全二叉树,就应该长这样在这里插入图片描述
在这里插入图片描述
在这里就有一个小技巧:每一个叶子节点在每一层都只会有一个与之相关的长官
所以这个关系应该是一条单链
举例说明:v1的价值贡献于root和f1的选择打仗或者种地有关,
而f2干什么在这里插入图片描述这样应该就能明白了吧!!!


之后我们再来想,因为每一个叶子节点的贡献我们需要找到每一层它的长官的抉择
所以这个状态我们必须要带着走,肯定有很多亲故会想到状压DP,在这里插入图片描述
其实根本不需要,因为我们采用状压DP,
是因为后面的状态会多次用到前面的某一个状态
而前面提到每一个叶子节点的贡献是有各自的单链决定的,
彼此之间的状态是不会冲突的
所以我们根本就不需要专门用一维去储存状态,
我们可以选择在dfs时把状态一起传下去即可,


对于状态转移方程式,我们可以换个角度转移,
每一个节点(除开叶子节点)都有且只有左右儿子,
就用DP[i][j]DP[i][j]DP[i][j]表示到i节点为止,一共有j个士兵参于打仗
DP[i][j+k]=DP[num<<1][j]+DP[num<<1∣1][k]DP[i][j+k]=DP[num<<1][j]+DP[num<<1|1][k]DP[i][j+k]=DP[num<<1][j]+DP[num<<11][k]
我们直接暴力枚举i的左右儿子各有多少个士兵参加战斗,更新出i参加战争的士兵
蒟蒻觉得这个方法转移很妙!!在这里插入图片描述

代码实现

我解释一下vis的巧妙用法,
为什么可以直接用vis把这一层k都直接赋值
这又要用到上面解释的每一层v都只有一个有关的长官
所以我就直接用这一层为0/1表示这一个长官是打仗还是种田
根本没有必要去找到那个长官具体是谁,
在这里插入图片描述
这就是dfs的好处,一条链找到底,完成状态更新后才改变状态
dfs也就决定了每一次重新改变状态的时候,都要清空上一次的状态值

#include <cstdio>
#include <iostream>
using namespace std;
#define MAXN 1500
int n, m, result;
int w[MAXN][15], f[MAXN][15], dp[MAXN][MAXN];
bool vis[15];void solve ( int num, int k ) {for ( int i = 0;i <= ( 1 << k );i ++ )dp[num][i] = 0;if ( ! k ) {for ( int i = 1;i <= n;i ++ )if ( vis[i] )dp[num][1] += w[num][i];elsedp[num][0] += f[num][i];return;}vis[k] = 0;solve ( num << 1, k - 1 );solve ( num << 1 | 1, k - 1 );for ( int i = 0;i <= ( 1 << ( k - 1 ) );i ++ )for ( int j = 0;j <= ( 1 << ( k - 1 ) );j ++ )dp[num][i + j] = max ( dp[num][i + j], dp[num << 1][i] + dp[num << 1 | 1][j] );vis[k] = 1;solve ( num << 1, k - 1 );solve ( num << 1 | 1, k - 1 );for ( int i = 0;i <= ( 1 << ( k - 1 ) );i ++ )for ( int j = 0;j <= ( 1 << ( k - 1 ) );j ++ )dp[num][i + j] = max ( dp[num][i + j], dp[num << 1][i] + dp[num << 1 | 1][j] );
}
int main() {scanf ( "%d %d", &n, &m );n --;for ( int i = 0;i < ( 1 << n );i ++ )for ( int j = 1;j <= n;j ++ )scanf ( "%d", &w[i + ( 1 << n )][j] );for ( int i = 0;i < ( 1 << n );i ++ )for ( int j = 1;j <= n;j ++ )scanf ( "%d", &f[i + ( 1 << n )][j] );solve ( 1, n );for ( int i = 0;i <= m;i ++ )result = max ( result, dp[1][i] );printf ( "%d", result );return 0;
}

总结一下感受,vis,dp的定义真的用的很巧妙
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318218.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用PerfView监测.NET程序性能(一):Event Trace for Windows

前言&#xff1a;在日常项目开发中&#xff0c;我们时不时会遇到程序占用了很高CPU的情况&#xff0c;可能是程序里某些未经优化的代码或者Bug&#xff0c;或者是程序运行压力太大。无论是什么原因&#xff0c;我们总希望能看到到底是哪个方法占用了如此高的CPU。微软为我们提供…

【用学校抄作业带你走进可持久化线段树(主席树)】可持久化线段树概念+全套模板+例题入门:[福利]可持久化线段树)

我似乎很少写这种算法博客可持久化线段树概念概念介绍&#xff08;类比帮助理解&#xff09;简单分析一下时间和空间复杂度&#xff08;内容池&#xff09;模板结构体变量建树模板单点修改模板单点查询模板区间修改模板&#xff08;pushup&#xff09;区间修改模板&#xff08;…

P3258 [JLOI2014]松鼠的新家

文章目录题意&#xff1a;题解&#xff1a;树上差分代码&#xff1a;树链剖分代码&#xff1a;P3258 [JLOI2014]松鼠的新家题意&#xff1a; n个点&#xff0c;n-1条边&#xff0c;给出每个点的拜访顺序&#xff0c;问每个点经过几次&#xff08;最后一次移动不算拜访&#xf…

[SOCI2005]最大子矩阵(DP) + [JXOI2018]守卫(DP) + [CQOI2016]手机号码(数位DP)[各种DP专练]

DP专练博客 DP专练T1&#xff1a;最大子矩阵题目题解代码实现T2&#xff1a;守卫题目题解代码实现T3&#xff1a;手机号码题目题解代码实现T1&#xff1a;最大子矩阵 题目 这里有一个n*m的矩阵&#xff0c;请你选出其中k个子矩阵&#xff0c;使得这个k个子矩阵分值之和最大。…

IdentityServer4-EF动态配置Client和对Claims授权(二)

本节介绍Client的ClientCredentials客户端模式&#xff0c;先看下画的草图&#xff1a;一、在Server上添加动态新增Client的API 接口。为了方便测试&#xff0c;在Server服务端中先添加swagger&#xff0c;添加流程可参考&#xff1a;https://www.cnblogs.com/suxinlcq/p/67575…

P3178 [HAOI2015]树上操作

P3178 [HAOI2015]树上操作 题意&#xff1a; 题解&#xff1a; 这已经是很裸的树链剖分了。。。 直接套模板 代码&#xff1a; #include<cmath> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespac…

dotnet core开源博客系统XBlog介绍

XBlog是dotnet core平台下的个人博客开源系统&#xff0c;它只需要通过Copy的方式即可以部署到Linux和windows系统中&#xff1b;如果你有安全证书那只需要简单配置一下即可提供安全的Https服务。接下来主要介绍XBlog功能、部署和基础设置。技术要点基于dotnet core平台&#x…

【莫队/树上莫队/回滚莫队】原理详解及例题:小B的询问(普通莫队),Count on a tree II(树上莫队),kangaroos(回滚莫队)

文章目录问题引入介绍莫队算法及其实现过程时间复杂度莫队算法适用范围莫队奇偶优化普通莫队&#xff1a;小B的询问树上莫队&#xff1a;SP10707 COT2 - Count on a tree II回滚莫队&#xff1a;[PA2011]Kangaroosupd&#xff1a;2021-08-11&#xff1a;重新对博客进行了外观美…

微软 2018 开源大事记

从微软公开宣布 "Microsoft love linux" 那一刻起&#xff0c;过去的几年里&#xff0c;微软积极拥抱开源的举动我们有目共睹&#xff0c;即便有过"Linux is a cancer"这种真香警告的 flag&#xff0c;但不得不承认的是&#xff0c;微软一系列“拥抱开源”…

模板:二叉搜索树平衡树

文章目录前言二叉搜索树代码treap代码splay开点旋转splay插入查找第k大元素查找给定元素的排名前驱&后继删除完整代码练习总结前言 终于开始学这个东西了 看了好几篇博客才找到一篇可读的qwq 我曾经还以为线段树码量大…我真傻&#xff0c;真的 所谓平衡树&#xff0c;就是…

P2486 [SDOI2011]染色

P2486 [SDOI2011]染色 题意&#xff1a; 题解&#xff1a; 与一般的树链剖分相比&#xff0c;不同点在于查询的不是路径上颜色的数量而是颜色段的数量 对于两个颜色段&#xff0c;112和221&#xff0c;两个颜色段数量都是2 如果合在一起颜色段的数量就是3&#xff0c;因为左边…

牛客网CSP-S提高组赛前集训营1题解(仓鼠的石子游戏 [博弈论] + 乃爱与城市的拥挤程度 [树上DP] + 小w的魔术扑克[dfs + 离线])

文章目录T1&#xff1a;仓鼠的石子游戏题目题解代码实现T2&#xff1a;乃爱与城市拥挤程度题目题解代码实现T3&#xff1a;小w的魔术扑克题目题解代码实现T1&#xff1a;仓鼠的石子游戏 题目 仓鼠和兔子被禁止玩电脑&#xff0c;无聊的他们跑到一块空地上&#xff0c;空地上有…

使用PerfView监测.NET程序性能(二):Perfview的使用

在上一篇博客使用PerfView监测.NET程序性能&#xff08;一&#xff09;&#xff1a;Event Trace for Windows 中&#xff0c;我们了解了对Windows及应用程序进行性能分析的基础&#xff1a;Event Trace for Windows (ETW)。现在来看看基于ETW的性能分析工具——Perfview.exePer…

学习有向图和无向图的强连通分量(基本概念+割点+点双联通分量+桥+边双连通分量+全套模板【Tarjan】)

最近总是考到Tarjan&#xff0c;让我措手不及基本概念割点以及点双连通分量Tarjan法求割点推导过程代码实现Tarjan法求点双连通分量推导过程代码实现有向图的Tarjan缩点桥与边双连通分量Tarjan法求桥理论推导代码实现Tarjan法求边双连通分量理论推导代码实现前言&#xff1a;有…

.NET Core下的Spring Cloud——前言和概述

前言前几年一直在写类似dubbo&#xff0c;Spring Cloud的微服务框架辗辗转转重复了多次&#xff0c;也重构推翻了很多次&#xff0c;其中诞生了“Rabbit.Rpc”,”Go”,”RabbitCloud”等开源项目。其中不乏他人对这些项目的完善。很高兴自己的开源项目能够给他人提供思路和复用…

CF785E Anton and Permutation

CF785E Anton and Permutation 题意&#xff1a; 对于一个长度为 n 的序列进行 k 次操作&#xff0c;每次操作都是交换序列中的某两个数。对于每一个操作&#xff0c;回答当前序列中有多少个逆序对。 1<n<200000 1<q<50000 题解&#xff1a; 动态逆序对&#x…

[ NOIP提高组 2016]愤怒的小鸟(暴搜 + 状压DP)// [SNOI2017]一个简单的询问(莫队)

一次性写两道题T1&#xff1a;一个简单的询问题目题解代码实现T2&#xff1a;愤怒的小鸟题目暴搜题解暴搜代码实现状压DP题解状压DP代码实现T1&#xff1a;一个简单的询问 题目 给你一个长度为 N 的序列 ai ,1≤i≤N&#xff0c;和 q 组询问&#xff0c;每组询问读入 l1,r1,l…

微软发布新的 Azure Pipelines 功能和集成

在最近举行的Connect()大会上&#xff0c;微软发布了几项新功能以及与 Azure Pipelines 的集成&#xff0c;包括 Visual Studio Code 的 Azure Pipelines 扩展、GitHub 版本管理、对 IoT 项目的支持以及 ServiceNow 集成。自从 9 月份推出 Azure Pipelines 以来&#xff0c;这种…

年末展望:Oracle 对 JDK收费和.NET Core 给我们的机遇

2018年就结束了&#xff0c;马上就要迎来2019年&#xff0c;这一年很不平凡&#xff0c;中美贸易战还在继续&#xff0c;IT互联网发生急剧变化&#xff0c;大量互联网公司开始裁员&#xff0c;微软的市值在不断上升 &#xff0c;在互联网公司的市值下跌过程中爬到了第一的位置&…

等比数列三角形 (数论 + 黄金分割点)+ JOISC 2016 Day3 T3 「电报」(基环树 + 拓扑排序)

文章目录T1&#xff1a;等比数列三角形题目题解代码实现T2&#xff1a;电报题目题解代码实现T1&#xff1a;等比数列三角形 题目 求三边都是 ≤n 的整数&#xff0c;且成等比数列的三角形个数 注意三角形面积不能为 0 注意 oeis 中未收录此数列&#xff0c;所以并不需要去搜了…