Cod sursa(job #2588276)

Utilizator ana_valeriaAna Valeria Duguleanu ana_valeria Data 24 martie 2020 16:48:34
Problema Jocul Flip Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.44 kb
#include <fstream>

using namespace std;
ifstream cin ("flip.in");
ofstream cout ("flip.out");
int a[20][20],lin[20],col[20],v1[20],v2[20],v3[20],v4[20];
int main()
{
    int n,m,i,j,ii,jj,s,maxx,S,suma1,suma2,suma10,suma11,suma20,suma21,x,y,k1,k2,k3,k4,l,c;
    cin>>n>>m;
    S=0;
    for (i=1; i<=n; i++)
        for (j=1; j<=m; j++)
        {
            cin>>a[i][j];
            S=S+a[i][j];
        }
    for (i=1; i<=n; i++)
    {
        s=0;
        for (j=1; j<=m; j++)
            s=s+a[i][j];
        lin[i]=s;
    }
    for (j=1; j<=m; j++)
    {
        s=0;
        for (i=1; i<=n; i++)
            s=s+a[i][j];
        col[j]=s;
    }
    maxx=S;
    x=((1<<n)-1)/2;
    y=((1<<m)-1)/2;
    for (i=0; i<=x; i++)
    {
        suma1=suma2=S;
        k1=k2=0;
        for (ii=0; ii<n; ii++)
            if (((i>>ii)&1)==1)
            {
                suma1=suma1-2*lin[ii+1];
                k1++;
                v1[k1]=ii+1;
            }
            else
            {
                suma2=suma2-2*lin[ii+1];
                k2++;
                v2[k2]=ii+1;
            }
        for (j=0; j<=y; j++)
        {
            suma11=suma1;
            suma10=suma1;
            suma21=suma2;
            suma20=suma2;
            k3=k4=0;
            for (jj=0; jj<m; jj++)
                if (((j>>jj)&1)==1)
                {
                    suma11=suma11-2*col[jj+1];
                    suma21=suma21-2*col[jj+1];
                    k3++;
                    v3[k3]=jj+1;
                }
                else
                {
                    suma10=suma10-2*col[jj+1];
                    suma20=suma20-2*col[jj+1];
                    k4++;
                    v4[k4]=jj+1;
                }
            for (l=1; l<=k1; l++)
            {
                for (c=1; c<=k3; c++)
                    suma11=suma11+4*a[v1[l]][v3[c]];
                for (c=1; c<=k4; c++)
                    suma10=suma10+4*a[v1[l]][v4[c]];
            }
            for (l=1; l<=k3; l++)
            {
                for (c=1; c<=k3; c++)
                    suma21=suma21+4*a[v2[l]][v3[c]];
                for (c=1; c<=k4; c++)
                    suma20=suma20+4*a[v2[l]][v4[c]];
            }
            if (suma11>maxx)
                maxx=suma11;
            if (suma10>maxx)
                maxx=suma10;
            if (suma21>maxx)
                maxx=suma21;
            if (suma20>maxx)
                maxx=suma20;
        }
    }
    cout<<maxx;
    return 0;
}