博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【题解】JLOI2015战争调度
阅读量:5255 次
发布时间:2019-06-14

本文共 1750 字,大约阅读时间需要 5 分钟。

  搜索+状压+DP。

  注意到一个性质:考虑一棵以x为根的子树,在x到原树的根的路径上的点如果都已经确定了方案,那么x的左右儿子的决策就彼此独立,互不影响了。所以我们考虑状压一条路径上每一层节点的状态,求出dp[u][x] : 以u为根的子树中分配x个作战平民的最大收益是多少(注意因为是在dfs当中,所以dp数组存的是在当前状况下的最优解)。

  代码挺短的,可食用~

#include 
using namespace std;#define maxn 1025 int n, m, tot, ans, dp[maxn][maxn];int w[maxn][20], f[maxn][20];int read(){ int x = 0, k = 1; char c; c = getchar(); while(c < '0' || c > '9') { if(c == '-') k = -1; c = getchar(); } while(c >= '0' && c <= '9') x = x * 10 + c - '0', c = getchar(); return x * k;}void dfs(int x, int y, int st, int cnt){ for(int i = 0; i <= cnt; i ++) dp[x][i] = 0; if(y == n - 1) { int id = x - (1 << y); for(int i = 0; i < y; i ++) if(st & (1 << i)) dp[x][1] += w[id][i]; else dp[x][0] += f[id][i]; return; } dfs(x << 1, y + 1, st | (1 << y), cnt >> 1); dfs(x << 1 | 1, y + 1, st | (1 << y), cnt >> 1); for(int i = cnt >> 1; ~i; i --) for(int j = cnt >> 1; ~j; j --) dp[x][i + j] = max(dp[x][i + j], dp[x << 1][i] + dp[x << 1 | 1][j]); dfs(x << 1, y + 1, st, cnt >> 1); dfs(x << 1 | 1, y + 1, st, cnt >> 1); for(int i = cnt >> 1; ~i; i --) for(int j = cnt >> 1; ~j; j --) dp[x][i + j] = max(dp[x][i + j], dp[x << 1][i] + dp[x << 1 | 1][j]);}int main(){ n = read(), m = read(); tot = (1 << (n - 1)); for(int i = 0; i < tot; i ++) for(int j = n - 2; ~j; j --) w[i][j] = read(); for(int i = 0; i < tot; i ++) for(int j = n - 2; ~j; j --) f[i][j] = read(); dfs(1, 0, 0, tot); ans = 0; for(int i = 0; i <= m; i ++) ans = max(ans, dp[1][i]); printf("%d\n", ans); return 0; }

 

转载于:https://www.cnblogs.com/twilight-sx/p/8818622.html

你可能感兴趣的文章
协程, IO阻塞模型 和 IO非阻塞模型
查看>>
ServerSocket和Socket通信
查看>>
css & input type & search icon
查看>>
jQuery插件开发详细教程
查看>>
Crontab 在linux中的非常有用的Schedule Jobs
查看>>
ProxySQL Scheduler
查看>>
源代码的下载和编译读后感
查看>>
Kafka学习笔记
查看>>
Octotree Chrome安装与使用方法
查看>>
用CALayer实现下载进度条控件
查看>>
Windows 环境下基于 Redis 的 Celery 任务调度模块的实现
查看>>
趣谈Java变量的可见性问题
查看>>
C# 强制关闭当前程序进程(完全Kill掉不留痕迹)
查看>>
ssm框架之将数据库的数据导入导出为excel文件
查看>>
语音识别中的MFCC的提取原理和MATLAB实现
查看>>
验证组件FluentValidation的使用示例
查看>>
0320-学习进度条
查看>>
解决windows系统的oracle数据库不能启动ora-00119和ora-00130的问题
查看>>
ip相关问题解答
查看>>
MetaWeblog API Test
查看>>