牛客:乌龟跑步

题目链接:https://ac.nowcoder.com/acm/problem/15294

题目描述:

有一只乌龟,初始在0的位置向右跑。
这只乌龟会依次接到一串指令,指令T表示向后转,指令F表示向前移动一个单位。乌龟不能忽视任何指令。
现在我们要修改其中正好n个指令(一个指令可以被改多次,一次修改定义为把某一个T变成F或把某一个F变成T)。
求这只乌龟在结束的时候离起点的最远距离。(假设乌龟最后的位置为x,我们想要abs(x)最大,输出最大的abs(x))

输入描述:

第一行一个字符串c表示指令串。c只由F和T构成。
第二行一个整数n。
1 <= |c| <= 100, 1 <= n <= 50

输出描述:

一个数字表示答案。

示例1:

输入:

FT
1

输出:

2

实例2:

输入:

FFFTFFF
2

输出:

6

思路:

这个题。。暴力吧,题目每种情况需要有到四个变量,1.遍历到数组的下标,2.剩余的操作次数,3.位置,4.下一步的方向。用dfs枚举所有的情况,改变的和没有改变的,但是题目要求的数据规模比较大,需要用到记忆搜索。。

代码:

#include<iostream>
#include<string>
#include<math.h>
#include<algorithm>
using namespace std;
string str;
int ans = 0;
int mem[105][55][205][2];

void dfs(int def, int n, int pos, int dir)
{
	if (def == str.size())
	{
		if (n % 2 == 0)
			ans = max(ans, (int)abs(pos));
		return;
	}
	if (n < 0 || mem[def][n][pos + 105][dir])
		return;
	mem[def][n][pos + 105][dir] = 1;
	if (dir == 0)
	{
		if (str[def] == 'F')
		{
			dfs(def + 1, n - 1, pos, 1);
			dfs(def + 1, n, pos - 1, 0);
		}
		else if (str[def] == 'T')
		{
			dfs(def + 1, n - 1, pos - 1, 0);
			dfs(def + 1, n, pos, 1);
		}
	}
	else if (dir == 1)
	{
		if (str[def] == 'F')
		{
			dfs(def + 1, n - 1, pos, 0);
			dfs(def + 1, n, pos + 1, 1);
		}
		else if (str[def] == 'T')
		{
			dfs(def + 1, n - 1, pos + 1, 1);
			dfs(def + 1, n, pos, 0);
		}
	}
}


int main()
{
	int n;
	cin >> str >> n;
	dfs(0, n, 0, 1);
	cout << ans << endl;
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值