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 ...
随机推荐
- leetcode817 Linked List Components
""" We are given head, the head node of a linked list containing unique integer value ...
- ACM-寻宝
题目描述:寻宝 有这么一块神奇的矩形土地,为什么神奇呢?因为上面藏有很多的宝藏.该土地由N*M个小正方形土地格子组成,每个小正方形土地格子上,如果标有“E”,则表示该格可以通过:如果标有“X”,则表示 ...
- python 求两个数的最大公约数
给定两个整数a,b,求他们的最大公约数 def gcd(a,b): if a<b: a,b=b,a while(a%b != 0): c = a%b a=b b=c return b a,b = ...
- 162-PHP 文本替换函数str_replace(三)
<?php $str='Hello world!'; //定义源字符串 $search=array('o','l','w'); //定义将被替换的字符数组 $replace='O'; //定义替 ...
- 吴裕雄--天生自然C++语言学习笔记:C++ 重载运算符和重载函数
C++ 允许在同一作用域中的某个函数和运算符指定多个定义,分别称为函数重载和运算符重载. 重载声明是指一个与之前已经在该作用域内声明过的函数或方法具有相同名称的声明,但是它们的参数列表和定义(实现)不 ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 字体图标(Glyphicons):glyphicon glyphicon-font
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- oracle中设置主键
1.创建表 .创建表 create table "c_user"( "id" number primary key, "username" ...
- php条件判断(9.29 第十五天)
超级全局变量:$GLOBALS //包含全部变量的全局组合数组$_SERVER //包含请求头中的信息,用户的IP.用户的UA.头信息$_REQUEST //包含用户提交的所有数据(POST/GET ...
- BZOJ 4888 [Tjoi2017]异或和
题解:对每一位分别考虑贡献 先求前缀和 按照二进制减法分类讨论,求出最终这一位是1还是0 用树状数组维护 注意:树状数组对0这个位置单独考虑 #include<iostream> #inc ...
- java课程之团队开发冲刺阶段2.3
一.总结昨天进度 1.完成整合功能 二.遇到的问题 1.在整合的过程中,总是发现在switch开关提醒了两次,后来发现是因为我使用了setChecked方法,而这个方法触发onCheckedChang ...