题目:传送门

题意:有 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. 验证码取不到$_SESSION['code']的值,无法进行验证码正误验证问题

    关键还是session启动问题.解释如下: //A.php session_start();//打开session 在每个页面使用Session前都需要先session_start $_SESSION ...

  2. input中name和id的区别

    一直很困惑,表单里面input标签有id和name,它们之间到底有什么区别自己很少去想,只知道一般的场景该怎么使用,今天就在网上搜索了一下,自己也总结一下.为什么有了ID还要有Name呢?其实ID就像 ...

  3. 剑指offer自学系列(四)

    题目描述: 输入一个正整数数组,把数组里面所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个,例如输入数组{3,32,321},输出的最小数字为321323 题目分析: 如果采用穷举法,把 ...

  4. 剑指offer自学系列(一)

    题目描述:输入n个整数,找出其中最小的k个数,例如,输入{4,5,1,6,2,7,3,8}这8个数字,最小的4个数字是1,2,3,4 题目分析:首先我能想到的是先对数组排序,从小到大,然后直接输出想要 ...

  5. pixi的图片处理

    pixi的图片处理   var texture = PIXI.Texture.fromImage('sprite.png');var sprite = new PIXI.Sprite(texture) ...

  6. C++编程学习(七) 循环结构

    1.continue:循环体中结束本次循环,直接进入下一次循环. 2.break:循环直接结束. 3.在for语句循环体中执行continue语句,程序会转到“表达式3”继续运行. 4.使用多重循环的 ...

  7. ExcelPackage导入导出,命名空间一定要是EPPlus

    1.引入EPPlus.dll,旧版的是OfficeOpenXml.dll,最好使用EPPlus2.调用 string path = UploadExecl(batchUpload.BinaryExce ...

  8. ActorFramework教程对比及规划

    牢骚太盛防肠断,风物长宜放眼量. 一.引子 昨天的文章,本来就是想写写ActorFramework的教程内容,结果写着写着偏了,变成了吐槽. 首先,声明一下,自己从未参加过任何LabVIEW培训班,也 ...

  9. 记录一次SQLServer 2019 MDS问题的排查

    问题表象: MDS网页里看不到任何建立的模型和实体. 用Excel add in连接,提示SQLServer授权过期. 但实际上SQLServer是企业版,目前并没有过期. 背景分析: 我们的环境是从 ...

  10. 如何通过模仿提升Paper写作能力?

    对于大部分初到国外留学的中国留学生们来说要想自己独立完成一篇Paper可能难度会很大,从Paper字体字号要求.Paper写作格式.Paper写作结构等等诸多因素都会影响留学生们写Paper的效率.对 ...