#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N=110,M=20;
ll n,m,f[N][M<<2][M<<2],df0[N],df1[N],df2[N];
ll ans,dm;
char a[N][M];
void dfs(ll ix,ll isum,ll icur){
if(icur>=m){
dm++;
df1[dm]=ix;
df2[dm]=isum;
return ;
}dfs(ix|(1<<icur),isum+1,icur+4);
dfs(ix,isum,icur+1);
}
int main(){
cin>>n>>m;
dfs(0ll,0ll,0ll);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
cin>>a[i][j];
ll tmp=a[i][j]<'I';
df0[i]=(df0[i]<<1)+tmp;
}
for(int i=1;i<=dm;i++)
if(!(df0[1]&df1[i]))
f[0][i][1]=df2[i];
for(int i=1;i<=dm;i++)
if(!(df0[2]&df1[i]))
for(int j=1;j<=dm;j++)
if(!(df0[1]&df1[j])&&!(df1[j]&df1[i]))
f[j][i][2]=df2[i]+df2[j];
for(int i=3;i<=n;i++)
for(int j=1;j<=dm;j++) //now
if(!(df0[i]&df1[j]))
for(int k=1;k<=dm;k++) //pre
if(!(df0[i-1]&df1[k])&&!(df1[j]&df1[k]))
for(int x=1;x<=dm;x++) //prepre
if(!(df1[j]&df1[x])&&!(df1[k]&df1[x])&&!(df0[i-2]&df1[x]))
f[k][j][i]=max(f[k][j][i],f[x][k][i-1]+df2[j]);
for(int i=1;i<=dm;i++)
for(int j=1;j<=dm;j++)
ans=max(ans,f[i][j][n]);
cout<<ans;
return 0;
}
//10pts
仅Sub0-#2AC
求调qwq