10pts求调
查看原帖
10pts求调
1255916
Iteration72楼主2025/6/22 11:40
#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

2025/6/22 11:40
加载中...