题意:给定一个机器人的执行序列,必须要对这个字符串改变n次,确定修改方案,确定机器人可以走的最远距离
做法:可以确定的是,机器人的最远距离不会超过100,明显可以用反证法,确定一个答案,来看其他的条件是否可以满足。可以先把重复改变的情况除掉,即不重复改变每一个字符。对一个字符重复操作会耗去两个操作数,所有,假设进行了0,1,2,3..次重复操作,剩下的就是真实操作数,可以对这里的每一种情况进行DFS。确立状态,为{dre,i,pos,cn},分别为行驶方向,现在的操作符序号,现在的坐标,现在剩余的改变数。机器人每次可以选择走路和转弯,当cn==0并且完成了所有操作时,机器人可以走到这个pos.
其实就是模拟机器人的运动方式来查找答案
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define LMT 105
using namespace std;
char work[LMT];
int len,n,dp[2][LMT<<1][LMT][52];
int dfs(bool dre,int pos,int i,int cn)
{
if(cn<0)return 0;
if(!work[i])return cn>0?0:abs(pos);
int &ret=dp[dre][pos+100][i][cn];
if(ret!=-1)return ret;
int mv=dre?1:-1;
return ret=max(dfs(dre,pos+mv,i+1,cn-(work[i]!='F')),dfs(!dre,pos,i+1,cn-(work[i]!='T')));
}
int main(void)
{
int ans=0;
scanf("%s%d",work,&n);
memset(dp,-1,sizeof(dp));
for(;n>=0;n-=2)ans=max(ans,dfs(1,0,0,n));
printf("%d\n",ans);
return 0;
}