#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#define N 51
using namespace std;
int dp[N*2][2][N][N*4];
char a[N*2];
int n,len,ans;
int dfs(int idx,int j,int t,int cur)
{
if(j>n) return 0;
if(idx==len)
{
ans=max(ans,abs(cur)-((n-j)&1));//如果是(n-j)剩下的操作数为奇数,那么减一
return ans;
}
int &res=dp[idx][(t-j)&1][n-j][cur+100];
if(res!=-1) return res;//记忆化搜索
if(a[idx]=='F') return res=dfs(idx+1,j,t,cur+(((t-j)&1)?-1:1));//如果是F,那么不转换
if(a[idx]=='T')
{
return res=max(dfs(idx+1,j,t+1,cur),dfs(idx+1,j+1,t+1,cur+(((t-j)&1)?-1:1)));//转换和不转换的情况
}
}
int main()
{
memset(dp,-1,sizeof dp);
scanf("%s",a);
len=strlen(a);
scanf("%d",&n);
dfs(0,0,0,0);
cout<<ans<<endl;
return 0;
}#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,len,ans,dp[102][2][51][202];char a[102];
int dfs(int idx,int j,int t,int cur){
if(j>n) return 0;if(!a[idx]) return ans=max(ans,(cur>=0?cur:-cur)-((n-j)&1));
if(dp[idx][(t-j)&1][n-j][cur+100]!=-1) return dp[idx][(t-j)&1][n-j][cur+100];
if(a[idx]=='F') return dp[idx][(t-j)&1][n-j][cur+100]=dfs(idx+1,j,t,cur+(((t-j)&1)?-1:1));
if(a[idx]=='T') return dp[idx][(t-j)&1][n-j][cur+100]=max(dfs(idx+1,j,t+1,cur),dfs(idx+1,j+1,t+1,cur+(((t-j)&1)?-1:1)));
}
int main(){
memset(dp,-1,sizeof dp);scanf("%s%d",a,&n);dfs(0,0,0,0),printf("%d\n",ans);
return 0;
}Codeforces 132C. Vasya and Beautiful Arrays【DP,dfs】
原文地址:http://blog.csdn.net/u013912596/article/details/38821009