E. Double Elimination (DP)
题目:传送门
题意:有 2^n 个人进行比赛,对他们编号 1~2^n,起初1和2打,3和4打,5和6打,7和8打...,然后1和2打完胜利的 和 3和4打完胜利的再打一场,1和2打完失败的和3和4打完失败的也再打一场,然后,失败组最终胜利的和胜利组最终胜利的再打一场。详情可看样例解释,结合着更容易理解。你有 k 个喜欢的队, 你想观看更多的你喜欢的队的比赛,你能决定比赛的胜利,问你最多能看多少场有你喜欢的队的比赛。
2 <= n <= 17 , 0 <= k <= 2^n
题解: 这里有个视频的讲解 戳
#include <bits/stdc++.h>
#define LL long long
#define mem(i, j) memset(i, j, sizeof(i))
#define rep(i, j, k) for(int i = j; i <= k; i++)
#define dep(i, j, k) for(int i = k; i >= j; i--)
#define pb push_back
#define make make_pair
#define INF INT_MAX
#define inf LLONG_MAX
#define PI acos(-1)
using namespace std; const int N = ( << ) + ;
///设 dp[ i ][ j ][ f1 ][ f2 ] 为从 j 开始,连续的 2^(i - 1) 个人比赛,胜利组胜出的人 0/1(f1) 你喜欢的队,失败组胜出的人 0/1(f2) 你喜欢的队。
int dp[][N][][];
int vis[N];
int main() { int n, k, x; scanf("%d %d", &n, &k); rep(i, , k) {
scanf("%d", &x);
vis[x - ] = ;
} mem(dp, -0x3f3f3f); rep(i, , n) {
for(int j = ; j < ( << n); j += ( << i)) {
if(i == ) {
rep(x1, , ) rep(x2, , ) {
if((x1 + x2) != (vis[j] + vis[j + ])) continue;
dp[i][j][x1][x2] = ((x1 + x2) > ? : );
}
}
else {
rep(x1, , ) rep(y1, , ) rep(x2, , ) rep(y2, , ) {
///x1,y1是从j开始连续的2^(i-1)个人比完后胜利者剩下的那个人的状态和失败组剩下的那个人的状态 (0:代表不是我喜欢的球队,1:代表是我喜欢的球队)
///x2,y2是从j+(1<<(i-1))开始连续的2^(i-1)个人比完后剩下的那个人的状态和失败者剩下的那个人的状态
///那么会有两次比赛,x1跟x2打,y1跟y2打,然后第二次有八种情况,逐个讨论
int res = dp[i - ][j][x1][y1] + dp[i - ][j + ( << (i - ))][x2][y2];
if(x1 || x2) res++; ///第一次比赛,先考虑
if(y1 || y2) res++; ///失败者最终胜利的是x2,那么有两种情况
dp[i][j][x1][x2] = max(dp[i][j][x1][x2], res + ( ( x2 + y1 > ) ? : ) ); ///第一次比赛时失败组胜出的是y1,然后y1会跟x2再比一场
dp[i][j][x1][x2] = max(dp[i][j][x1][x2], res + ( ( x2 + y2 > ) ? : ) ); ///第一次比赛时失败组胜出的是y2,然后y2会跟x2再比一场 /// 失败者最终胜利的分别是y1和y2,第一次比赛时胜利者胜出的是x1
dp[i][j][x1][y1] = max(dp[i][j][x1][y1], res + ( ( y1 + x2 > ) ? : ) );///若第一次比赛y1胜出,y1会跟x2再比一场
dp[i][j][x1][y2] = max(dp[i][j][x1][y2], res + ( ( y2 + x2 > ) ? : ) );///若第一次比赛y2胜出,y2会跟x2再比一场 ///下同,只是换成了最终胜利的是x2
dp[i][j][x2][x1] = max(dp[i][j][x2][x1], res + ( ( x1 + y1 > ) ? : ) );
dp[i][j][x2][x1] = max(dp[i][j][x2][x1], res + ( ( x1 + y2 > ) ? : ) ); dp[i][j][x2][y1] = max(dp[i][j][x2][y1], res + ( ( y1 + x1 > ) ? : ) );
dp[i][j][x2][y2] = max(dp[i][j][x2][y2], res + ( ( y2 + x1 > ) ? : ) );
}
}
}
} int ans = ;
rep(x1, , ) rep(y1, , ) {
int res = dp[n][][x1][y1];
if(x1 || y1) res++;
ans = max(ans, res);
}
printf("%d\n", ans); return ;
}
E. Double Elimination (DP)的更多相关文章
- 【POJ 3071】 Football(DP)
[POJ 3071] Football(DP) Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 4350 Accepted ...
- Tour(dp)
Tour(dp) 给定平面上n(n<=1000)个点的坐标(按照x递增的顺序),各点x坐标不同,且均为正整数.请设计一条路线,从最左边的点出发,走到最右边的点后再返回,要求除了最左点和最右点之外 ...
- HDU6578 2019HDU多校训练赛第一场 1001 (dp)
HDU6578 2019HDU多校训练赛第一场 1001 (dp) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6578 题意: 你有n个空需要去填,有 ...
- LightOJ 1033 Generating Palindromes(dp)
LightOJ 1033 Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...
- lightOJ 1047 Neighbor House (DP)
lightOJ 1047 Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...
- UVA11125 - Arrange Some Marbles(dp)
UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...
- 【CF618F】Double Knapsack(构造)
[CF618F]Double Knapsack(构造) 题面 洛谷 Codeforces 题解 很妙的一道题. 发现找两个数集很不爽,我们强制加强限制,我们来找两个区间,使得他们的区间和相等. 把区间 ...
- 初探动态规划(DP)
学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...
- 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)
.navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-invers ...
随机推荐
- Django(九)模型:dj查询数据库的函数(方法)
一.查询函数 通过模型类.objects属性可以调用如下函数,实现对模型类对应的数据表的查询. 函数表 函数名 功能 返回值 说明 get 返回表中满足条件的一条且只能有一条数据. 返回值是一个模型类 ...
- postgres http fdw + plv8 处理数据
原理很简单就是就有http fdw 获取数据,然后结合plv8 处理json 数据 环境准备 docker-compose 文件 version: "3" services: p ...
- RadioButton之互斥选择和Toast显示
前言: RadioButton用来单选并且用Toast来进行提示所选内容 RadioButton标签单独写的时候不能出现互斥现象,代码如下 <RadioButton android:layout ...
- TensorFlow2 Part3:动态模型建立与训练
Keras是一个由Python编写的开源人工神经网络库,可以作为Tensorflow.Microsoft-CNTK和Theano的高阶应用程序接口,进行深度学习模型的设计.调试.评估.应用和可视化 [ ...
- 五十一、SAP中使程序结构化,模块化
一.我们创建3个引用单元,这3个单元里面分别存放定义相关,执行相关和子程序相关的内容 二.将程序中的各部分都拆分到INCLUDE文件中,DEF文件内容如下 三.INC文件内容 四.MAIN文件中写程序 ...
- linux项目,项目报错,排查
今天在遇到以前部署的项目突然没有数据了,然后就去服务器看了一下,打印日志发现报错了,现在我是一脸懵逼,因为不知道怎么排查 然后同事告诉说先看报错的原因,然后再去找认识的类,我打码的都是一些认识的 然后 ...
- linux crash工具安装配置
crash简介 crash是redhat的工程师开发的,主要用来离线分析linux内核转存文件,它整合了gdb工具,功能非常强大.可以查看堆栈,dmesg日志,内核数据结构,反汇编等等.crash支持 ...
- 【剑指Offer】面试题11. 旋转数组的最小数字
题目 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转.输入一个递增排序的数组的一个旋转,输出旋转数组的最小元素.例如,数组 [3,4,5,1,2] 为 [1,2,3,4,5] 的一个 ...
- wireshark封包详细信息详解(10.15 第二十一天)
wireshark:网络流量抓取分析神器,需要学习一些常用的数据包过滤规则 IP过滤 ip.addr==192.168.1.1 只要包中的IP有192.168.1.1的,就会提取过来 IP源地址:ip ...
- Egret Engine 2D - 显示对象
alpha:透明度 width:宽度 height:高度 rotation:旋转角度 scaleX:横向缩放 scaleY:纵向缩放 skewX:横向斜切 skewY:纵向斜切 visible ...