题目链接: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;
}