链接:https://www.nowcoder.com/acm/contest/70/E
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #define ll long long const int mx = 55; const int inf = 0x3f3f3f3f; //const int mod = 1e9 + 7; using namespace std; int dp[2][55][105]; //方向, 修改次数,指令数 char str[105]; int main(){ int len,n,dir; int ans1, ans2; scanf("%s",str+1); scanf("%d",&n); memset(dp,-inf,sizeof(dp)); // cout<<dp[0][0][0]<<endl; len = strlen(str+1); dp[1][0][0] = 0; //dir = 1; for(int i = 1; i <= len; i++) if(str[i]=='T'){ dp[1][0][i] = dp[0][0][i-1]; dp[0][0][i] = dp[1][0][i-1]; } else{ dp[1][0][i] = dp[1][0][i-1]+1; dp[0][0][i] = dp[0][0][i-1]-1; } //cout<<dp[1][0][1]<<endl; for(int j = 1; j <= n; j++) //修改次数 for(int k = 1; k <= len; k++) //指令长度 if(str[k] == 'F'){ dp[0][j][k] = max(dp[1][j-1][k-1],dp[0][j][k-1]-1); dp[1][j][k] = max(dp[0][j-1][k-1],dp[1][j][k-1]+1); } else{ dp[0][j][k] = max(dp[1][j][k-1],dp[0][j-1][k-1]-1); dp[1][j][k] = max(dp[0][j][k-1],dp[1][j-1][k-1]+1); } if(dp[0][n][len] <-100) ans1 = dp[1][n][len]; else ans1 = dp[0][n][len]; memset(dp,inf,sizeof(dp)); // 左边 dp[1][0][0] = 0; for(int i = 1; i <= len; i++) if(str[i]=='T'){ dp[1][0][i] = dp[0][0][i-1]; dp[0][0][i] = dp[1][0][i-1]; } else{ dp[1][0][i] = dp[1][0][i-1]+1; dp[0][0][i] = dp[0][0][i-1]-1; } for(int j = 1; j <= n; j++) //修改次数 for(int k = 1; k <= len; k++) //指令长度 if(str[k] == 'F'){ dp[0][j][k] = min(dp[1][j-1][k-1],dp[0][j][k-1]-1); dp[1][j][k] = min(dp[0][j-1][k-1],dp[1][j][k-1]+1); } else{ dp[0][j][k] = min(dp[1][j][k-1],dp[0][j-1][k-1]-1); dp[1][j][k] = min(dp[0][j][k-1],dp[1][j-1][k-1]+1); } if(dp[0][n][len] >100) ans2 = dp[1][n][len]; else ans2 = dp[0][n][len]; // cout<<ans1<<",,,"<<-ans2<<endl; cout<<max(ans1, -ans2)<<endl; return 0; }