主体思路,并不难想,但是刚开始,我感觉处理起来很麻烦,这主要还是因为,我对题目的认识达不到
主体思路对了不行,真正做出一道题,还是要把转移方程和状态表示搞的足够清楚才行
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define FOR(i,l,r) for(int (i)=(l);(i)<=(r);(i)++)
using namespace std;
int n;
int f[2][4][4][4][4];
inline int cal(int a,int b,int c)
{
int tmp=1;
if(a!=0&&a!=b&&a!=c)tmp++;
if(b!=0&&b!=c)tmp++;
return tmp;
}
int main()
{
scanf("%d",&n);
memset(f,-1,sizeof(f));
int last=0,now=1;
f[0][0][0][0][0]=0;
FOR(i,1,n)
{
int k;
char s;
while((s=getchar())==' '||(s=='\n'));
switch(s)
{
case 'M':k=1;break;
case 'F':k=2;break;
case 'B':k=3;break;
}
FOR(a1,0,3) FOR(a2,0,3)
FOR(b1,0,3) FOR(b2,0,3)
{
if (f[last][a1][a2][b1][b2]==-1) continue;
int tmp=cal(a1,a2,k);
f[now][a2][k][b1][b2]=
max(f[now][a2][k][b1][b2],f[last][a1][a2][b1][b2]+tmp);
tmp=cal(b1,b2,k);
f[now][a1][a2][b2][k]=
max(f[now][a1][a2][b2][k],f[last][a1][a2][b1][b2]+tmp);
}
swap(now,last);
}
int ans=0;
FOR(a1,0,3) FOR(a2,0,3)
FOR(b1,0,3) FOR(b2,0,3)
ans=max(ans,f[last][a1][a2][b1][b2]);
printf("%d",ans);
return 0;
}