Cod sursa(job #2741742)

Utilizator maria.rotaruMaria Rotaru maria.rotaru Data 18 aprilie 2021 16:49:24
Problema Jocul Flip Scor 20
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.55 kb
#include <fstream>
#define NMAX 16

using namespace std;

ifstream cin("flip.in");
ofstream cout("flip.out");

int a[NMAX+1][NMAX+1], linie[NMAX+1];
struct ura{
  int viz, el;
}col[NMAX+1];
bool v[NMAX+1];


int main()
{
    int n,m,suma=0;
    cin>>n>>m;
    if (n>=m)
    {
        for (int i=1; i<=n; i++)
            for (int j=1; j<=m; j++)
                cin>>a[i][j], col[j].el+=a[i][j], suma+=a[i][j];

    }
    else
    {
        for (int i=1; i<=n; i++)
            for (int j=1; j<=m; j++)
                cin>>a[j][i], col[j].el+=a[j][i], suma+=a[j][i];
        swap(n,m);
    }
    int maxi = -1000000;
    for (int i=1; i<= (1<<m)-1; i++)
    {
        for (int j=1; j<=m; j++)
            col[j].viz = 0;
        int s = suma;
        for (int j=0; j<m; j++)
            if ((i>>j)&1)
                s -= (2*col[j+1].el), col[j+1].viz=1;
        if (s>maxi)
        {
            maxi = s;
            for (int j=1; j<=m; j++)
                if (col[j].viz)
                    v[j]=true;
                else
                    v[j]=false;
        }
    }
    suma = maxi;
    for (int i=1; i<=n; i++)
        for (int j=1; j<=m; j++)
            if (v[j]==true)
                linie[i] -= a[i][j];
            else
                linie[i] += a[i][j];

    for (int i=1; i<= (1<<n)-1; i++)
    {
        int s=suma;
        for (int j=0; j<n; j++)
            if ((i>>j)&1)
                s -= (2*linie[j+1]);
        if (s>maxi)
            maxi=s;
    }

    cout<<"\n"<<maxi;
    return 0;
}