思路:dp[i][j][k][dir] 表示第i的字符,第j次操作,能否到达k的位置上。dir是方向 1向右,0向左。
#include<bits/stdc++.h>
#define debug(a) cout << #a << " " << a << endl
#define LL long long
#define ull unsigned long long
#define PI acos(-1.0)
#define eps 1e-6
const int N=1e4+7;
using namespace std;
char s[N];
int dp[105][55][210][2];
int main ()
{
//yyy_3y
//freopen("1.in","r",stdin);
scanf("%s",s+1);
int n; scanf("%d",&n);
dp[0][0][100][1]=1;
int len=strlen(s+1);
for(int i=1;i<=len;i++)
for(int j=0;j<=n;j++)
for(int k=0;k<=200;k++){
if(s[i]=='F'){
//F->T改变朝向
if(j) dp[i][j][k][1]|=dp[i-1][j-1][k][0];
if(j) dp[i][j][k][0]|=dp[i-1][j-1][k][1];
//不改变的话
dp[i][j][k+1][1]|=dp[i-1][j][k][1];
dp[i][j][k-1][0]|=dp[i-1][j][k][0];
}else{
//T->F,继续前进
if(j) dp[i][j][k+1][1]|=dp[i-1][j-1][k][1];
if(j) dp[i][j][k-1][0]|=dp[i-1][j-1][k][0];
//不改变当前T,改变朝向
dp[i][j][k][1]|=dp[i-1][j][k][0];
dp[i][j][k][0]|=dp[i-1][j][k][1];
}
}
int ans=0;
for(int i=0;i<=200;i++){
if(dp[len][n][i][0]) ans=max(ans,abs(100-i));
if(dp[len][n][i][1]) ans=max(ans,abs(100-i));
}
printf("%d\n",ans);
return 0;
}