DP.
我居然写了BFS+编码,别人状态都记两位我记了三位,再次证明了我是有多么若…
虽然慢如狗但还是A了,感动!
意外地发现了似乎有#inlcude<queue>
就可以使用vector了?
AC code:
#include <cstdio>
#include <queue>
#include <cstring>
using namespace std;
const int N=100010;
int n,ans;
int f[1<<7][1<<7],g[1<<7][1<<7];
char s[N];
struct Sta{
int S1,S2,i;
Sta() {}
Sta(int S1,int S2,int i):S1(S1),S2(S2),i(i) {}
};
queue<Sta> Q;
vector<Sta> V;
int add(char c,int S){
S>>=2;
if(c=='M') S+=1<<4;
else if(c=='F') S+=2<<4;
else S+=3<<4;
return S;
}
int getval(int S){
int cnt=0;
bool h[4]={0};
for(int i=1;i<=3;i++,S>>=2) h[(((S>>1)&1)<<1)+(S&1)]=1;
for(int i=1;i<=3;i++){
if(h[i]) cnt++;
}
return cnt;
}
void DP(){
int maxi=0;
Q.push(Sta(0,0,0));
while(1){
Sta x=Q.front(),y;
if(x.i==n) break;
Q.pop();
y.i=x.i+1;
if(y.i>maxi){
maxi=y.i;
for(int i=0;i<(int)V.size();i++){
g[V[i].S1][V[i].S2]=f[V[i].S1][V[i].S2];
f[V[i].S1][V[i].S2]=0;
}
V.clear();
}
y.S1=add(s[x.i],x.S1);y.S2=x.S2;
if(g[x.S1][x.S2]+getval(y.S1)>f[y.S1][y.S2]){
if(!f[y.S1][y.S2]){
Q.push(y);
V.push_back(Sta(y.S1,y.S2,233));
}
f[y.S1][y.S2]=g[x.S1][x.S2]+getval(y.S1);
}
y.S1=x.S1;y.S2=add(s[x.i],x.S2);
if(g[x.S1][x.S2]+getval(y.S2)>f[y.S1][y.S2]){
if(!f[y.S1][y.S2]){
Q.push(y);
V.push_back(Sta(y.S1,y.S2,233));
}
f[y.S1][y.S2]=g[x.S1][x.S2]+getval(y.S2);
}
}
}
int main(){
scanf("%d%s",&n,s);
DP();
for(int i=0;i<(1<<7);i++){
for(int j=0;j<(1<<7);j++) ans=f[i][j]>ans?f[i][j]:ans;
}
printf("%d\n",ans);
return 0;
}