Cod sursa(job #3136659)

Utilizator Ruxandra009Ruxandra Vasilescu Ruxandra009 Data 7 iunie 2023 15:22:14
Problema Jocul Flip Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.41 kb
#include <bits/stdc++.h>

using namespace std;

ifstream f("flip.in");
ofstream g("flip.out");

long long n, m, A[20][20], sol[20], fr[20], maxi = LONG_LONG_MIN, v[20], B[20][20];

void verif1(long long k)
{
    long long sumi = 0;

    for(long long i = 1; i <= k; i ++)
        for(long long j = 1; j <= m; j ++)
            B[sol[i]][j] *= (-1);

    for(long long i = 1; i <= n; i ++)
        for(long long j = 1; j <= m; j ++)
        {
            sumi += B[i][j];
            B[i][j] = A[i][j];
        }

    if(sumi > maxi)
    {
        for(long long i = 1; i <= k; i ++)v[i] = sol[i];
        v[0] = k; maxi = sumi;
    }
}

void comb1(long long K)
{
    if(K <= n)
    {
        for(long long i = 1; i <= n; i ++)
            if(!fr[i]){
                fr[i] = 1;
                sol[K] = i;
                verif1(K);
                comb1(K + 1);
                fr[i] = 0;
            }
    }
}

void verif2(long long k)
{
    long long sumi = 0;

    for(long long i = 1; i <= k; i ++)
        for(long long j = 1; j <= n; j ++)
            B[j][sol[i]] *= (-1);

    for(long long i = 1; i <= n; i ++)
        for(long long j = 1; j <= m; j ++)
        {
            sumi += B[i][j];
            B[i][j] = A[i][j];
        }

    if(sumi > maxi)
    {
        for(long long i = 1; i <= k; i ++)v[i] = sol[i];
        v[0] = k; maxi = sumi;
    }
}

void comb2(long long K)
{
    if(K <= m)
    {
        for(long long i = 1; i <= m; i ++)
            if(!fr[i]){
                fr[i] = 1;
                sol[K] = i;
                verif2(K);
                comb1(K + 1);
                fr[i] = 0;
            }
    }
}

int main()
{
    f >> n >> m;
    for(long long i = 1; i <= n; i ++)
        for(long long j = 1; j <= m; j ++)
        {
            f >> A[i][j];
            B[i][j] = A[i][j];
            maxi += A[i][j];
        }

    comb1(1);

    for(long long i = 1; i <= v[0]; i ++)
        for(long long j = 1; j <= m; j ++)
        {
            A[v[i]][j] *= (-1);
            B[v[i]][j] *= (-1);
        }

    comb2(2);

    for(long long i = 1; i <= v[0]; i ++)
        for(long long j = 1; j <= n; j ++)
            A[j][v[i]] *= (-1);

    long long sumi = 0;
    for(long long i = 1; i <= n; i ++)
        for(long long j = 1; j <= m; j ++)
            sumi += A[i][j];

    g << sumi;
    return 0;
}