题目:传送门

题意:有 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)的更多相关文章

  1. 【POJ 3071】 Football(DP)

    [POJ 3071] Football(DP) Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4350   Accepted ...

  2. Tour(dp)

    Tour(dp) 给定平面上n(n<=1000)个点的坐标(按照x递增的顺序),各点x坐标不同,且均为正整数.请设计一条路线,从最左边的点出发,走到最右边的点后再返回,要求除了最左点和最右点之外 ...

  3. HDU6578 2019HDU多校训练赛第一场 1001 (dp)

    HDU6578 2019HDU多校训练赛第一场 1001 (dp) 传送门:http://acm.hdu.edu.cn/showproblem.php?pid=6578 题意: 你有n个空需要去填,有 ...

  4. LightOJ 1033 Generating Palindromes(dp)

    LightOJ 1033  Generating Palindromes(dp) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid= ...

  5. lightOJ 1047 Neighbor House (DP)

    lightOJ 1047   Neighbor House (DP) 题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=87730# ...

  6. UVA11125 - Arrange Some Marbles(dp)

    UVA11125 - Arrange Some Marbles(dp) option=com_onlinejudge&Itemid=8&category=24&page=sho ...

  7. 【CF618F】Double Knapsack(构造)

    [CF618F]Double Knapsack(构造) 题面 洛谷 Codeforces 题解 很妙的一道题. 发现找两个数集很不爽,我们强制加强限制,我们来找两个区间,使得他们的区间和相等. 把区间 ...

  8. 初探动态规划(DP)

    学习qzz的命名,来写一篇关于动态规划(dp)的入门博客. 动态规划应该算是一个入门oier的坑,动态规划的抽象即神奇之处,让很多萌新 萌比. 写这篇博客的目标,就是想要用一些容易理解的方式,讲解入门 ...

  9. 2017百度之星资格赛 1003:度度熊与邪恶大魔王(DP)

    .navbar-nav > li.active > a { background-image: none; background-color: #058; } .navbar-invers ...

随机推荐

  1. 051、Java中使用while循环实现1~100的累加

    01.代码如下: package TIANPAN; /** * 此处为文档注释 * * @author 田攀 微信382477247 */ public class TestDemo { public ...

  2. Docker退出容器不关闭容器的方法

    进入docker容器后如果退出容器,容器就会变成Exited的状态,那么如何退出容器让容器不关闭呢? 如果要正常退出不关闭容器,请按Ctrl+P+Q进行退出容器,这一点很重要,请牢记! 以下示例为退出 ...

  3. SpringMVC之ModelAndView的用法

    https://blog.csdn.net/qq30211478/article/details/78016155

  4. 你从未见过的Case Study写作指南

    Case Study,意为案例分析,Case Study与其它的留学论文作业最大的的差别就在于Case Study在论文开始就需要明确给出论,然后再阐述这个结论的论证依据和理由.留学生们需要知道的是C ...

  5. Mybatis 学习一

    一.mybatis是什么 mybatis是一个持久层的框架,它可以完全替代JDBC,同时提供接口编程.它访问DAO层是不需要实现类的,只需要一个接口和XML文件(或注解).mybatis让程序将主要精 ...

  6. 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:SSH框架(Struts2+Spring+Hibernate)搭建整合详细步骤

    在实际项目的开发中,为了充分利用各个框架的优点,通常都会把 Spring 与其他框架整合在一起使用. 整合就是将不同的框架放在一个项目中,共同使用它们的技术,发挥它们的优点,并形成互补.一般而言,在进 ...

  7. 第四篇Django之模板语言

    Django之模板语言 一 模板的执行 模板的创建过程,对于模板,其实就是读取模板(其中嵌套着模板的标签),然后将Model中获取的数据插入到模板中,最后将信息返回给用户 def current_da ...

  8. check Linux文件夹个数

    (ls -l|grep "^-"| wc -l)查看某个文件夹下文件的个数.(ls -lR|grep "^-"| wc -l)查看某个文件夹下文件的个数,包括子 ...

  9. SpringMVC: JSON

    SpringMVC:JSON讲解 什么是JSON? JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式,目前使用特别广泛. 采用完全独立于编 ...

  10. tab选项卡,带自动播放

    <!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...