dp傻x题
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+10;
int n,ans,f[2][4][4][4][4];
int rv[305];char s[N];
inline void itia(int o)
{
int i,j,k,t;
for(i=0;i<=3;++i)
for(j=0;j<=3;++j)
for(k=0;k<=3;++k)
for(t=0;t<=3;++t)
f[o][i][j][k][t]=-1;
f[o][0][0][0][0]=0;
}
int main(){
int q=0,p,i,j,k,t,now,x,y,ret;
scanf("%d%s",&n,s);itia(1);
rv[(int)'M']=1;rv[(int)'F']=2;rv[(int)'B']=3;
for(p=0;p<n;++p,q^=1){
now=rv[s[p]];itia(q);
for(i=0;i<=3;++i)for(j=0;j<=3;++j) for(k=0;k<=3;++k)for(t=0;t<=3;++t)
if(f[q^1][i][j][k][t]!=-1){
x=y=1;ret=f[q^1][i][j][k][t];
if(j && j!=now) x++;
if(j && i && i!=now && i!=j) x++;
f[q][j][now][k][t]=max(f[q][j][now][k][t],ret+x);
if(t && t!=now) y++;
if(k && t && k!=now && k!=t) y++;
f[q][i][j][t][now]=max(f[q][i][j][t][now],ret+y);
}
}q^=1;
for(i=0;i<=3;++i)
for(j=0;j<=3;++j)
for(k=0;k<=3;++k)
for(t=0;t<=3;++t)
ans=max(f[q][i][j][k][t],ans);
printf("%d\n",ans);
}