Codeforces 1310 B Double Elimination —— 记忆化搜索,有丶东西

2024-04-06 23:48

本文主要是介绍Codeforces 1310 B Double Elimination —— 记忆化搜索,有丶东西,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

This way

题意:

现在有 2 n 2^n 2n个队伍,第一次每相邻两个队伍比赛,然后剩下 2 n − 1 2^{n-1} 2n1个胜利者和 2 n − 1 2^{n-1} 2n1个loser,胜利者会进行下一场比赛,同时loser也会进行下一场比赛,然后对于这次胜利者淘汰下来的 2 n − 2 2^{n-2} 2n2个人,加上loser中的 2 n − 2 2^{n-2} 2n2个人,又进行一场比赛,然后循环这个操作,直到最后一个胜利者和最后一个loser,他们会进行一次决斗。
你有一些喜欢的人,给你这些人的编号,你可以任意指定每一个人每一局的输赢使得所有比赛中包含你喜欢的人出场的比赛最多,问你最多是多少。

题解:

我看了有很多解法,但是我一个都想不出来,我选了记忆化搜索来理解,dp[x][l][r]表示在l到r这个区间最终赢的赢和输的赢的状态为x时答案最大是多少。因为败方比赛会有两次,所以可以直接用2表示败方是否有。
那么状态转移就是两个子区间的和,枚举左区间和右区间的情况。

((i&2)|(i<<1)|j)&3

这里我也理解了一会,这种情况是i的胜败了,i&2表示i的败方是否有喜欢的队伍,i<<1表示i的胜方到败方时是否有喜欢的队伍。

#include<bits/stdc++.h>
using namespace std;
const int N=(1<<17)+5;
unordered_map<int,int>mp[4][N];
bool fav[N];
int dfs(int l,int r,int s){//01:赢得赢 10:输的赢if(r==l+1){int num1=fav[l]+fav[r],num2=(s&1)+(s>>1);if(num1==num2)return min(1,num2);elsereturn -1e6;}if(mp[s][l].count(r))return mp[s][l][r];int ans=-1e6,mid=l+r>>1;for(int i=0;i<4;i++){for(int j=0;j<4;j++){int ilose=((i&2)|(i<<1)|j)&3,jlose=((j&2)|(j<<1)|i)&3;if(ilose==s||jlose==s)ans=max(ans,dfs(l,mid,i)+dfs(mid+1,r,j));}}return mp[s][l][r]=ans+s;
}
int main()
{int n,m,x;scanf("%d%d",&n,&m);for(int i=1;i<=m;i++)scanf("%d",&x),fav[x]=1;int ans=0;for(int i=0;i<4;i++)ans=max(ans,dfs(1,1<<n,i));printf("%d\n",ans+(m?1:0));//最后赢和输还有一场对决return 0;
}

这篇关于Codeforces 1310 B Double Elimination —— 记忆化搜索,有丶东西的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/881151

相关文章

找完工作该补充的东西

首先: 锻炼身体,包括乒乓球,羽毛球,都必须练习,学习,锻炼身体等是一个很重要的与人交际沟通的方式; 打牌,娱乐:会玩是一个人很重要的交际沟通的法宝; 摄影:这个是一个兴趣爱好,也是提高自己的审美,生活品质,当然也是与人沟通的重要途径; 做饭:这个的话就是对自己,对朋友非常有益的一件事情;

【文末附gpt升级秘笈】腾讯元宝AI搜索解析能力升级:千万字超长文处理的新里程碑

腾讯元宝AI搜索解析能力升级:千万字超长文处理的新里程碑 一、引言 随着人工智能技术的飞速发展,自然语言处理(NLP)和机器学习(ML)在各行各业的应用日益广泛。其中,AI搜索解析能力作为信息检索和知识抽取的核心技术,受到了广泛的关注和研究。腾讯作为互联网行业的领军企业,其在AI领域的探索和创新一直走在前列。近日,腾讯旗下的AI大模型应用——腾讯元宝,迎来了1.1.7版本的升级,新版本在AI搜

代码随想录算法训练营第三十九天|62.不同路径 63. 不同路径 II 343.整数拆分 96.不同的二叉搜索树

LeetCode 62.不同路径 题目链接:62.不同路径 踩坑:二维的vector数组需要初始化,否则会报错访问空指针 思路: 确定动态数组的含义:dp[i][j]:到达(i,j)有多少条路经递推公式:dp[i][j] = dp[i-1][j] + dp[i][j-1]初始化动态数组:dp[0][0] = 1遍历顺序:从左到右,从上到下 代码: class Solution {pu

leetcode刷题(45)——35. 二叉搜索树的最近公共祖先

给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。” 例如,给定如下二叉搜索树: root = [6,2,8,0,4,7,9,null,null,3,5] 示例 1: 输入: root = [

【智能优化算法改进策略之局部搜索算子(五)—自适应Rosenbrock坐标轮换法】

1、原理介绍 作为一种有效的直接搜索技术,Rosenbrock坐标轮换法[1,2]是根据Rosenbrock著名的“香蕉函数”的特点量身定制的,该函数的最小值位于曲线狭窄的山谷中。此外,该方法是一种典型的基于自适应搜索方向集的无导数局部搜索技术。此法于1960年由Rosenbrock提出,它与Hooke-Jeeves模式搜索法有些类似,但比模式搜索更为有效。每次迭代运算分为两部分[3]: 1)

Codeforces 158B

很久没有刷题了,刚刚有小学弟问了这道题,AC之后贴上来吧。水~~~ #include <cstdio>#include <cmath>int main() {int n;while(scanf("%d", &n) != EOF) {int a = 0, b = 0, c = 0, d = 0;int arr[100001];for (int i = 0; i < n; ++

Codeforces April Fools Day Contest 2014(附官方题解)

Codeforces2014年愚人节的坑题。。。但还是感觉挺好玩的。。。 A. The Great Game time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Two teams mee

Codeforces April Fools Day Contest 2013

2013年愚人节的坑题。。。 A. Mysterious strings time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output Input The input contains a sin

Day59 代码随想录打卡|二叉树篇---把二叉搜索树转换为累加树

题目(leecode T538): 给出二叉 搜索 树的根节点,该树的节点值各不相同,请你将其转换为累加树(Greater Sum Tree),使每个节点 node 的新值等于原树中大于或等于 node.val 的值之和。 提醒一下,二叉搜索树满足下列约束条件: 节点的左子树仅包含键 小于 节点键的节点。节点的右子树仅包含键 大于 节点键的节点。左右子树也必须是二叉搜索树。 方法:本题

智能优化算法改进策略之局部搜索算子(六)--进化梯度搜索

1、原理介绍     进化梯度搜索(Evolutionary Gradient Search, EGS)[1]是兼顾进化计算与梯度搜索的一种混合算法,具有较强的局部搜索能力。在每次迭代过程中,EGS方法首先用受进化启发的形式估计梯度方向,然后以最陡下降的方式执行实际的迭代步骤,其中还包括步长的自适应,这一过程的总体方案如下图所示:     文献[1]