nf-oj|机器人 (rabot)

nf-oj|机器人 (rabot)

为什么叫 rabot 啊,英语真好。

机器人robot(rabot)

描述

南海区机器人比赛即将开始,该比赛的的规则如下:

1、将机器人摆放在数轴0的位置。

2、机器人只能向左或向右走,

3、参赛选手可以编写指令:FF(向前走一步),T T(掉头)。

现在笑笑写了一串指令准备去参赛,由于笑笑有很强的计算能力,他可以马上知道机器人最后会走到哪里。为了难倒笑笑,他的好朋友酷酷就说,现在让你修改其中 n\rm n 个指令,使得机器人移动到离起点最远的地方。(修改是指“ T T ”变成“ FF ”,或“ FF ”变成“ TT ”,可以对同一个指令多次修改)。

输入

第一行一个字符串 SS 代表指令

接下来一行一个整数 nn ,表示要修改的指令个数

输出

共一行,一个正整数,表示离起点(位置 00 )最远的距离。

输入样例 1

FFFTFFF 

2

输出样例 1

6

提示

1len(s)1001\le len(s)\le 100

1n501 \le n \le 50


思路

这一题看着就没有好一点的思路,这时候可以看看数据范围。只有 100 / 50 。非常的小。

数学方法想不到,其实从题面,可以想到 dp ,搜索。

搜索

题目的变量给的挺清楚的,有当前执行命令( cnt ),方向( d ),走的距离( p ),要执行的指令( q )。

即可对这四个状态进行搜索。

先判断边界:

  • cnt>len+1q>ncnt > len+1 || q>n 时( >len 时统计答案 ),return ;

统计答案 : cnt>len   and   q==ncnt>len \ \ \ and \ \ \ q==n

记忆化: 将状态都存到 vis 里面

dfs:

  • 对当前的用两次指令,剩下的不变;

  • 当前为 T/F 的话,各有两种情况,在代码里面看吧;

挺好理解的其实。

主要的细节即:距离可能为负数,将方向标为 1/-1 时候会有负数;

记得加一个偏移量。

代码
// written by yfz
// dfs
#include<bits/stdc++.h>
using namespace std;
char str[111];
int vis[111][211][55][3];
int n,ans,len;
void dfs(int cnt,int p,int q,int d) {
//当前执行第 cnt 个指令 当前距离为 p 当前使用第 q 个指令 当前的方向 d(1/-1) 
	if(q>n||cnt>len+1) return;//越界返回 
	if(cnt>len&&q==n) {//统计答案
		ans=max(ans,abs(p));
		return ; 
	}
	if(vis[cnt][p+100][q][d+1]) return;//记忆化返回 && 记忆化 
	vis[cnt][p+100][q][d+1]=1;
	dfs(cnt,p,q+2,d);
	if(str[cnt]=='F') {// F 的情况 
		dfs(cnt+1,p+d,q,d);
		dfs(cnt+1,p,q+1,-d);
	}
	if(str[cnt]=='T') {// T 的情况 
		dfs(cnt+1,p,q,-d);
		dfs(cnt+1,p+d,q+1,d);
	}
}
int main() {
	cin>>str+1;
	cin>>n;
	len=strlen(str+1);
	dfs(1,0,0,1);
	cout<<ans;
	return 0;
}
posted @   cjrqwq  阅读(9)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示