字符选择的题解

目录

原题描述:

题目描述

样例输入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.mzph.cn/news/220424.shtml

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

相关文章

linux下部署东方通

第一步&#xff1a;安装jdk&#xff0c;此处不做过多介绍 第二步&#xff1a;东方通安装 1、下载东方通&#xff0c;建议去官网进行下载压缩包&#xff0c;同时下载授权文件&#xff01; 2、将压缩包上传至linux相对目录下进行解压 unzip Install_TW6.1.5.8_Enterprise_Lin…

Python 快速入门——基础语法

python 的语法逻辑完全靠缩进&#xff0c;建议缩进 4 个空格。 如果是顶级代码&#xff0c;那么必须顶格书写&#xff0c;哪怕只有一个空格也会有语法错误。 下面示例中&#xff0c;满足 if 条件要输出两行内容&#xff0c;这两行内容必须都缩进&#xff0c;而且具有相同的缩进…

计算机操作系统-第十五天

目录 线程的状态与转换 线程的组织与控制 本节思维导图 线程的状态与转换 线程的状态转换与进程的状态转换是一样的 线程的组织与控制 进程的控制块叫做PCB&#xff0c;线程的控制块叫做TCB 堆栈指针可以找到线程的堆栈在内存中的哪个位置&#xff0c;所以不需要保存堆栈…

Android多进程和跨进程通讯方式

前言 我们经常开发过程中经常会听到线程和进程&#xff0c;在讲述Android进程多进程前我打算先简单梳理一下这俩者。 了解什么是进程与线程 进程&#xff1a; 系统中正在运行的一个应用程序&#xff0c;某个程序一旦运行就是一个进程&#xff0c;是资源分配的最小单位&#…

Java Web Day02_HTML基础标签语法

HMTL基础标签 一、视频video标签 <video src”视频的路径”controls”控制播放、暂停、音量等”autoplay”自动播放”loop”循环播放”width”视频播放器的宽度”height”视频播放器的高度”></video>还有做浏览器兼容的方式&#xff1a; <video controls a…

C++RTTI(运行时类型识别)介绍

介绍 RTTI&#xff08;Run-Time Type Information&#xff09;是C中的一个重要特性&#xff0c;它允许在运行时获取类型信息。 RTTI提供了两个主要的操作&#xff1a;dynamic_cast和typeid。这些操作在运行时检查类型&#xff0c;允许我们在运行时决定如何处理对象。 dynami…

iframe postMessage 通信

嵌入 iframe <iframesrc"/model/index.html"id"modelIframe"name"modelIframe"frameborder"0"></iframe>发送信息 let modelIframe: any;// 初始化 document.getElementById(modelIframe).onload function () {modelIfr…

Spark作业提交原理

1.6 Spark作业提交原理 Spark作业&#xff08;任务&#xff09;提交就是使用spark中spark-sumbit命令将已经封装好成jar包的程序提交到spark集群中执行运行从而得到计算结果的过程&#xff0c;在提交过程中我们对提交的作业&#xff08;任务&#xff09;进行参数设置操作 spa…

SAP ABAP给销售订单添加抬头、行项目文本

SAP ABAP给销售订单添加抬头、行项目文本 第一步&#xff1a;创建文本ID 1&#xff0c;通过SE75&#xff0c;新键文本对象的文本ID 2&#xff0c;2 &#xff0c;找到对象VBBK 销售 标题文件 3&#xff0c;点击文本IDS 4&#xff0c;进去后新建文本ID 第二步&#xff1a;通过…

使用Visual Studio(VS)创建空项目的Win32桌面应用程序【main函数入口变WinMain】

前言 在Visual Studio中直接新建Windows桌面应用程序会有很多多余的代码生成&#xff0c;本文将提供从空项目创建Win32项目的方法&#xff0c;解决新建空项目直接使用WinMain代码编译报错的问题 例如&#xff1a;LNK2019 &#xff1a;无法解析的外部符号 参考博客&#xff1…

ChibiOS简介4/5

ChibiOS简介4/5 1. 源由2. ChibiOS基础知识4/52.13 Chapter 13 - RT Synchronous Messages2.13.1 Basic concepts2.13.2 APIs 2.14 Chapter 14 - RT Events2.14.1 Basic concepts2.14.1.1 Events2.14.1.2 Operations 2.14.2 APIs 2.15 Chapter 15 - RT Debug2.15.1 Compile Tim…

【PTA刷题】堆栈模拟队列代码+详解

文章目录 题目C代码详解 题目 设已知有两个堆栈S1和S2&#xff0c;请用这两个堆栈模拟出一个队列Q。 所谓用堆栈模拟队列&#xff0c;实际上就是通过调用堆栈的下列操作函数: int IsFull(Stack S)&#xff1a;判断堆栈S是否已满&#xff0c;返回1或0&#xff1b;int IsEmpty (S…

without explicit opt-in, is unsupported. Switch Maven repository ‘maven8

Using insecure protocols with repositories, without explicit opt-in, is unsupported. Switch Maven repository maven8 大概意思是 不支持对存储库使用不安全的协议.看下maven库&#xff0c;把http开头的改成https就好了。

B站武sir-django教程(1)

day15 初识Django Python知识点&#xff1a;函数、面向对象。前端开发&#xff1a;HTML、CSS、JavaScript、jQuery、BootStrap。MySQL数据库。Python的Web框架&#xff1a; Flask&#xff0c;自身短小精悍 第三方组件。Django&#xff0c;内部已集成了很多组件 第三方组件。…

Restormer技术点小结

1. 解决cnn的不足&#xff1a; 1&#xff09;感受野有限 2&#xff09;输入尺寸固定 2. 解决transform的不足&#xff1a; 1&#xff09;计算复杂度随着空间分辨率的增加而二次增长 3. 优势结构&#xff1a;MDTA(Multi-Dconv Head Transposed Attention)和GDFN( Gated-Dco…

医疗机构,为什么要开通预约挂号服务?门诊患者双向“获利”

随着科技的不断发展&#xff0c;越来越多的医疗机构开始提供预约挂号服务&#xff0c;以更方便、快捷地为患者提供就诊服务。 减少患者在等待时间上的压力&#xff0c;让患者更加有序地安排自己的就医计划。同时&#xff0c;预约挂号还可以提高医疗门诊工作效率与患者的满意度…

Sentinel使用详解

组件简介 Sentinel是阿里开源的一套用于服务容错的综合性解决方案。它以流量为切入点&#xff0c;从流量控制、熔断降级、系统负载保护等多个维度来保护服务的稳定性。Sentinel承接了阿里巴巴近10年的双十一大促流量的核心场景&#xff0c;例如秒杀、消息削峰填谷、集群流量控…

C语言 内存操作函数 +内存分区

内存操作函数 memset() //memset 函数将指定内存区域 ptr 开始的 num 个字节设置为 value。 void *memset(void *ptr, int value, size_t num);参数&#xff1a;ptr&#xff1a;指向要填充的内存区域的指针。value&#xff1a;要填充的值&#xff0c;以整数形式传递。num&…

20-11版本AUTOSAR_PRS_LogAndTraceProtocol文档翻译

1简介和概述 本协议规范规定了AUTOSAR协议Dlt的格式、消息序列和语义。 该协议允许将诊断、日志和跟踪信息发送到通信总线上。 因此&#xff0c;Dlt模块从应用程序或其他软件模块收集调试信息&#xff0c;向调试信息添加元数据&#xff0c;并将其发送到通信总线。 此外&#x…

软件设计师——信息安全(一)

&#x1f4d1;前言 本文主要是【信息安全】——软件设计师——信息安全的文章&#xff0c;如果有什么需要改进的地方还请大佬指出⛺️ &#x1f3ac;作者简介&#xff1a;大家好&#xff0c;我是听风与他&#x1f947; ☁️博客首页&#xff1a;CSDN主页听风与他 &#x1f304…