Cod sursa(job #1761648)

Utilizator leraValeria lera Data 22 septembrie 2016 17:27:01
Problema Jocul Flip Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream fin("flip.in");
ofstream fout("flip.out");
int a[17][17],maxx=0,iff[17],nrl,nrc,n,m,lin[17],col[17],v[17],s;
void bckc(int k,int si)
{
    for(int i=v[k-1]+1;i<=nrc;i++)
    {
        v[k]=i;
        iff[i]=1;
        if(k<=nrc)
        {
            int ss=si+a[0][col[i]];
            int sq=s-ss;
            int sss=ss*(-1);
            for(int j=1;j<=nrl;j++)
            {
                int sum=0;
                for(int q=1;q<=nrc;q++)
                    if(iff[q]==1)
                        sum+=a[lin[j]][col[q]];
                if(sss+3*sum+a[lin[j]][0]*(-1)>sss)
                {
                    sss+=a[lin[j]][0]*(-1)+3*sum;
                    sq-=a[lin[j]][0];
                    sq+=sum;
                }
            }
            if(sss+sq>maxx)maxx=sss+sq;
            if(k<nrc)bckc(k+1,si+a[0][col[i]]);
        }
       iff[i]=0;
    }
}
int main()
{
    int i,j,ssi;
    fin>>n>>m;
    for(i=1;i<=n;i++)
        for(j=1;j<=m;j++)
            {
                fin>>a[i][j];
                s+=a[i][j];
                a[i][0]+=a[i][j];
                a[0][j]+=a[i][j];
            }
    maxx=s;
    ssi=0;
    for(i=1;i<=m;i++)
    if(a[0][i]<0){
        nrc++;
        col[nrc]=i;
    }
    for(i=1;i<=n;i++)if(a[i][0]<0)
    {
        ssi+=a[i][0]*(-1);
        nrl++;
        lin[nrl]=i;
    }
    if(ssi>maxx)maxx=ssi;
    bckc(1,0);
    fout<<maxx;
    return 0;
}