#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