字符选择的题解

news2024/12/23 12:05:32

目录

原题描述:

题目描述

样例输入1

样例输出1

样例输入2

样例输出2

题目大意:

主要思路:

change的设计:

dp的转移:

dp初始化:

dp的结算:

注意事项:

代码(有注释):


原题描述:

题目描述

Alice 和 Bob 在玩游戏。

给出一个长度为偶数的,非空的且仅含小写字母的字符串s。每个玩家还拥有一个初始为空的字符串。

Alice 先手,两名玩家交替行动。在一次行动中,玩家可以取 s 首或尾字符,将其从 s 中移除后加入到自己的字符串的 最前面

当 s 为空时游戏结束,拥有字典序更小的字符串的玩家获胜。若两名玩家的字符串相等则平局。

若 Alice 和 Bob 都足够聪明,判断谁会取胜,或者游戏为平局。

数据组数t\le15\sum |s| \le 3 \times 10^3。保证所有输入的 |s|长度都为偶数。

样例输入1

1

aa

样例输出1

Draw

样例输入2

1

ab

样例输出2

Alice 

题目大意:

给你一个字符串,每次玩家可以从左边或右边取走一个字符放在自己的最前边,两名玩家交替行动,问最后谁赢了,Alice赢了输出Alice,Bob赢了输出Bob,平局输出Draw。

主要思路:

这个题很难想,很难想到区间dp来做,即使想到了也未必写出来。

想到区间dp来做后,我们发现这个题的分割点再左或右,我们可以用0表示Alice赢,1表示平局,其他数表示Bob赢,我们先设计一个函数change(a,b,c),表示是谁赢,a代表是谁赢,b表示Alice选什么,c表示Bob选啥,dp[l][r]代表区间[l~r]是谁赢。

change的设计:

如果a不是平局的话,那么就应该从a转移过来,就return a,否则就返回选的谁大谁小。

dp的转移:

这个dp可以从四个地方转移:

v1=dp[l+1][r-1],Alice取l,Bob取r

v2=dp[l+2][r],Alice取l,Bob取l+1

v3=dp[l+1][r-1],Alice取r,Bob取l

v4=dp[l][r-2],Alice取r,Bob取r-1

dp初始化:

要初始化成Bob赢。

dp的结算:

由于Alice先手,所以最外层是min(也就是为啥Alice赢的数字是0)内层是max(Bob的赢)

等想到这些后就好写了。

注意事项:

  1. 当len=2时,如果两侧不相同,Alice必赢,否则平局。

代码(有注释):

#include<bits/stdc++.h>
using namespace std;
int dp[3010][3010];
char s[3010];
int change(int a,int b,int c)
{
	if(a!=1)
	{
		return a;
	}
	return s[b]<s[c]?0:(s[b] == s[c]?1:2);//判断谁赢 
}
int main()
{
//	freopen("sample (42).in","r",stdin);
	int t;
	cin>>t;
	while(t--)
	{
		cin>>s+1;
		int n=strlen(s+1);
		for(int i=1;i<=n;i++)
		{
			for(int j=1;j<=n;j++)
			{
				dp[i][j] = 3;//初始化 
			}
		}
		for(int len=2;len<=n;len+=2)
		{
			for(int l=1;l+len-1<=n;l++)
			{
				int r=l+len-1;
				if(len == 2)
				{
					dp[l][r] = (s[l] == s[r]);
					continue;
				}
				int ret=2;
				ret = min(ret,max(change(dp[l+1][r-1],l,r),change(dp[l+2][r],l,l+1)));
				ret = min(ret,max(change(dp[l+1][r-1],r,l),change(dp[l][r-2],r,r-1)));//结算 
				dp[l][r] = ret;
			}
		}
		cout<<(dp[1][n]==0?"Alice\n":(dp[1][n]==1?"Draw\n":"Bob\n"));
	}
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1302376.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

cogvlm:visual expert for large lanuage models

CogVLM: Visual Expert For Large Language Models论文笔记 - 知乎github: https://github.com/THUDM/CogVLM简介认为原先的shallow alignment效果不好&#xff08;如blip-2&#xff0c;llava等&#xff09;&#xff0c;提出了visual expert module用于特征的deep fusion在10项…

【go语言实践】go运算符

go语言的运算符与c的基本一致 算术运算符 算术运算符中有以下几点需要注意&#xff1a; 对一个数取模时&#xff0c;等价于a%b a - a/b * bgo的、–只能当做独立语句使用&#xff0c;不能混合赋值语句&#xff0c;如&#xff1a;num2 : num1go的&#xff0c;–只能写在变量后…

YOLOv8/YOLOv7/YOLOv5/YOLOv4/Faster-rcnn系列算法改进【NO.83】将主干特征提取网络Backbone改为RevCol

前言 作为当前先进的深度学习目标检测算法YOLOv8,已经集合了大量的trick,但是还是有提高和改进的空间,针对具体应用场景下的检测难点,可以不同的改进方法。此后的系列文章,将重点对YOLOv8的如何改进进行详细的介绍,目的是为了给那些搞科研的同学需要创新点或者搞工程项目…

管程模型与锁

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 在如何学习Java并发编程…

操作系统大会 openEuler Summit 2023即将召开,亮点不容错过

【12月11日&#xff0c;北京】数字化、智能化浪潮正奔涌而来。操作系统作为数字基础设施的底座&#xff0c;已经成为推动产业数字化、智能化发展的核心力量&#xff0c;为数智未来提供无限可能。12月15-16日&#xff0c;以“崛起数字时代 引领数智未来”为主题的操作系统大会 &…

Python - 搭建 Flask 服务实现图像、视频修复需求

目录 一.引言 二.服务构建 1.主函数 upload_gif 2.文件接收 3.专属目录 4.图像修复 5.gif2mp4 6.mp42gif 7.图像返回 三.服务测试 1.服务启动 2.服务调用 四.总结 一.引言 前面我们介绍了如何使用 Real-ESRGAN 进行图像增强并在原始格式 jpeg、jpg、mp4 的基础上…

ROB的结构与作用

在流水线的提交&#xff08;Commit&#xff09;阶段&#xff0c;之所以能够将乱序执行的指令变回程序中指定的顺序状态,主要是通过重排序缓存(Reorder Buffer, ROB)来实现的 ROB本质上是一个FIFO在它当中存储了一条指令的相关信息,例如这条指令的类型、结果、目的寄存器和异常…

QT作业3

完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&#xf…

关于照片时间轴修改的方法根据文件名修改拍摄日期、创建日期等信息根据时间戳文件名修改照片信息

由于时光相册倒闭&#xff0c;从云上下载回来的数据有很多是乱序的、没有时间轴 关于照片时间轴修改的方法 根据文件名修改拍摄日期、创建日期等信息 根据时间戳文件名修改照片信息 其中有几种情况 1.文件名带有照片拍摄日期时间 2.文件名是时间戳&#xff08;微信图片&a…

阿里面试:如何保证RocketMQ消息有序?如何解决RocketMQ消息积压?

尼恩说在前面 在40岁老架构师 尼恩的读者交流群(50)中&#xff0c;最近有小伙伴拿到了一线互联网企业如阿里、滴滴、极兔、有赞、希音、百度、网易、美团的面试资格&#xff0c;遇到很多很重要的面试题&#xff1a; 如何保证RocketMQ消息有序&#xff1f;如何解决RocketMQ消息…

Docker多平台安装与配置指南

Docker的流行使得它成为开发者和运维人员不可或缺的工具。在本文中&#xff0c;将深入探讨如何在不同平台上安装和配置Docker&#xff0c;旨在为大家提供详尽的指南&#xff0c;确保他们能够顺利地使用这一强大的容器化工具。 Docker基础概念回顾 Docker利用容器技术&#xf…

排序与算法--冒泡排序

1.原理 比较两个相邻的元素&#xff0c;将较大的值交换到右边 2.举例&#xff1a;2 8 7 5 9 4 3 第一趟&#xff1a; 第一次&#xff1a;比较第一个和第二个&#xff1a;2 8 &#xff0c;不需要交换 第二次&#xff1a;比较 8 7&#xff0c;将8和7进行交换&#xff1a;2 7 …

山海鲸开发者:展现数据可视化在各领域的无限可能

作为一名山海鲸可视化软件的内部开发者&#xff0c;我对这款软件投入了大量的经历以及含有深深的情感。下面&#xff0c;我从这款软件应用场景下手&#xff0c;带大家探秘这款软件的多种可能性以及我们的用心。 首先&#xff0c;从行业角度来看&#xff0c;山海鲸可视化软件可以…

玩法题材创新的跑酷游戏,广告变现不止带来收益 | TopOn变现干货

跑酷游戏是一类永不落伍的游戏。从远古的红白机到现代的PC、手机&#xff0c;经典作品层出不穷&#xff0c;而提起手机端的跑酷游戏&#xff0c;相信大部分玩家脑海里的第一印象便是《神庙逃亡》和《地铁跑酷》这两款经典游戏&#xff0c;在上蹿下跳、左右挪移间躲避障碍&#…

Web自动化测试工具起到哪些重要作用

随着互联网的迅猛发展&#xff0c;Web应用程序已经成为企业不可或缺的一部分。为了确保Web应用的质量和可靠性&#xff0c;Web自动化测试工具变得至关重要。以下是Web自动化测试工具在软件开发生命周期中发挥的作用&#xff1a; 1. 提高测试效率和速度 Web自动化测试工具可以快…

简单实现Spring容器(二) 封装BeanDefinition对象放入Map

阶段2: // 1.编写自己的Spring容器,实现扫描包,得到bean的class对象.2.扫描将 bean 信息封装到 BeanDefinition对象,并放入到Map.思路: 1.将 bean 信息封装到 BeanDefinition对象中,再将其放入到BeanDefinitionMap集合中,集合的结构大概是 key[beanName]–value[beanDefintion…

网贷教父判无期,千家万户哭成狗

作者&#xff5c;翻篇 新熔财经快评&#xff1a; 真是太气人了 e租宝崩盘后 比它更大的雷又来了 “网贷教父”周世平 非法吸收公众存款1090亿 被判了无期 48万多人的血汗钱啊 就这样血本无归了 要知道 当年周世平做p2p 就靠着全额垫付 这颗定心丸 大量的宝妈 上…

作业12.11

1 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&…

前端开发转行做渗透测试容易吗?通过挖漏洞来赚钱靠谱吗?

最近&#xff0c;一个做运维的朋友在学渗透测试。他说&#xff0c;他公司请别人做渗透测试的费用是 2w/人天&#xff0c;一共2周。2周 10w 的收入&#xff0c;好香~ CSDN大礼包&#xff1a;《黑客&网络安全入门&进阶学习资源包》免费分享 于是&#xff0c;我也对渗透测…

聊聊跨进程共享内存的内部工作原理

在 Linux 系统的进程虚拟内存中&#xff0c;一个重要的特性就是不同进程的地址空间是隔离的。A 进程的地址 0x4000 和 B 进程的 0x4000 之间没有任何关系。这样确确实实是让各个进程的运行时互相之间的影响降到了最低。某个进程有 bug 也只能自己崩溃&#xff0c;不会影响其它进…