字符选择的题解

目录

原题描述:

题目描述

样例输入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.hqwc.cn/news/256930.html

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

相关文章

使用智能AI文心一言处理采集数据

简数采集器支持调用百度智能AI文心一言大模型API接口&#xff0c;可对采集的数据进行研究分析&#xff0c;内容创作。 文心一言API使用方法如下&#xff1a; 目录 1. 采集数据 2. 申请API 3. 对接文心一言API 4. 设置文心一言API的执行指令 5. 使用文心一言API处理采集数…

Java 第21章 网络通信

网络程序设计基础 网络程序设计编写的是与其他计算机进行通信的程序。Java 已经将网络程序所需要的元素封装成不同的类&#xff0c;用户只要创建这些类的对象&#xff0c;使用相应的方法&#xff0c;即使不具备有关的网络支持&#xff0c;也可以编写出高质量的网络通信程序。 …

OpenEuler_22.03升级mongdb到7.0.4

使用命令&#xff1a;lscpu&#xff0c;查看cpu架构为aarch64为arm架构的一种执行状态。 所以我们直接下载arm的包安装即可。无需自己编译源码。 下载地址&#xff1a;https://www.mongodb.com/try/download/community 下载解压 wget https://fastdl.mongodb.org/linux/mong…

高精度时钟芯片SD2405

概要 SD2405是一款非常优秀的RTC解决方案&#xff0c;为了能让用户在Arduino上有一款方便易用的时钟模块。该模块是一款内置晶振&#xff0c;支持IIC串行接口的高精度时钟模块&#xff1b;内置一次性工业级电池&#xff0c;可保证外部掉电的情况下&#xff0c;可以继续工作5~8…

c语言词法分析器

词法分析器&#xff08;也称为词法解析器或词法扫描器&#xff09;是编译器的一个组成部分&#xff0c;它的任务是将输入的源代码&#xff08;字符流&#xff09;分解成称为“标记”的序列&#xff0c;其中每个标记对应于源代码中的一个单词或符号。 以下是一个简单的C语言词法…

CTF-misc(1)图片隐写

笔记目录 渗透测试工具(1)wireshark渗透测试工具(2)Nmap渗透测试工具(3)BurpsuiteAWD比赛(1)AWD入门攻略大纲CTF-Web(2)SQL注入CTF-Web(3)文件上传漏洞 图片隐写目录 (1)GIf和二维码隐写 二维码补全 二维码绘图 Gif规律分析 (2)文本附加图片隐写 (3)IHDR文件头修复图片宽高 (…

案例060:基于微信小程序考试系统

文末获取源码 开发语言&#xff1a;Java 框架&#xff1a;SSM JDK版本&#xff1a;JDK1.8 数据库&#xff1a;mysql 5.7 开发软件&#xff1a;eclipse/myeclipse/idea Maven包&#xff1a;Maven3.5.4 小程序框架&#xff1a;uniapp 小程序开发软件&#xff1a;HBuilder X 小程序…

C++ day58 每日温度 下一个更大元素

题目1&#xff1a;739 每日温度 题目链接&#xff1a;每日温度 对题目的理解 temperature[i]表示每天的温度&#xff0c;返回数组answer&#xff0c;answer[i]指对于第i天&#xff0c;下一个更高温度最近出现在几天后&#xff0c;如果气温在这之后都不会升高&#xff0c;用0…

完蛋了!我不小心把整个Linux操作系统的权限都给修改了!在线等修复!

最近一个客户在群里说他一不小心把某台业务服务器的根目录权限给改了&#xff0c;本来想修改当前目录&#xff0c;结果执行成了根目录。 # 预期执行 chown 4auser:4agroup ./ -R # 最终执行 chown 4auser:4agroup . / -R看到这里我顿感不妙&#xff01; 果然&#xff0c;他接着…

LangChain 23 Agents中的Tools用于增强和扩展智能代理agent的功能

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…

<Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux文件管理(3)》(27)

《Linux操作系统原理分析之Linux文件管理&#xff08;3&#xff09;》&#xff08;27&#xff09; 8 Linux文件管理8.6 文件管理和操作8.6.1 系统对文件的管理8.6.2 进程对文件的管理 8 Linux文件管理 8.6 文件管理和操作 8.6.1 系统对文件的管理 Linux 系统把所有打开的活动…

连号区间数

/* 两重循环,如果是连号区间,那么区间长度必然 最大值 - 最小值 第二层循环的时候可以更新每个区间的最大值,最小值。中间的元素不需要考虑 *//* 暴力做法:在第二层循环时,每次多创建一个数组存放i~j之间的数,对其排序Arrays.sort(data,i,j1) 然后再多一层循环判断d[k] 1 d[k…