求挑错
  • 板块CF1391D 505
  • 楼主绝顶我为峰kkksd06
  • 当前回复0
  • 已保存回复0
  • 发布时间2020/8/11 17:48
  • 上次更新2023/11/6 20:37:38
查看原帖
求挑错
85682
绝顶我为峰kkksd06楼主2020/8/11 17:48

RT,WA on test #9

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define int long long
int n,m,a[1000001][4],dp[1000001][2][2][2];
signed main()
{
    scanf("%lld%lld",&n,&m);
    if(n>=4&&m>=4)
    {
        puts("-1");
        return 0;
    }
    if(n<m)
        for(register int i=1;i<=n;++i)
            for(register int j=1;j<=m;++j)
            {
                a[j][i]=getchar()-'0';
                while(a[j][i]!=1&&a[j][i]!=0)
                    a[j][i]=getchar()-'0';
            }
    else
    {
        for(register int i=1;i<=n;++i)
            for(register int j=1;j<=m;++j)
            {
                a[i][j]=getchar()-'0';
                while(a[i][j]!=1&&a[i][j]!=0)
                    a[i][j]=getchar()-'0';
            }
        n^=m^=n^=m;
    }
    if(n==1)
    {
        puts("0");
        return 0;
    }
    for(register int p=2;p<=m;++p)
        for(register int i=0;i<=1;++i)
            for(register int j=0;j<=1;++j)
                for(register int k=0;k<=1;++k)
                    dp[p][i][j][k]=1ll<<40;
    for(register int i=0;i<=1;++i)
        for(register int j=0;j<=1;++j)
            for(register int k=0;k<=1;++k)
                dp[1][i][j][k]=(a[1][1]^i)+(a[1][2]^j)+(a[1][3]^k);
    for(register int i=2;i<=m;++i)
        for(register int l=0;l<(1<<n);++l)
            for(register int r=0;r<(1<<n);++r)
            {
                int aa=l&1,b=(l>>1)&1,c=(l>>2)&1,d=r&1,e=(r>>1)&1,f=(r>>2)&1;
                if((aa^b^d^e)&&(b^c^e^f))
                    dp[i][d][e][f]=min(dp[i][d][e][f],dp[i-1][aa][b][c]+(a[i][1]^d)+(a[i][2]^e)+(a[i][3]^f));
            }
    int ans=1ll<<60;
    for(register int i=0;i<=1;++i)
        for(register int j=0;j<=1;++j)
            for(register int k=0;k<=1;++k)
                ans=min(ans,dp[m][i][j][k]);
    printf("%lld\n",ans);
    return 0;
}
2020/8/11 17:48
加载中...