Cod sursa(job #1761194)

Utilizator leraValeria lera Data 21 septembrie 2016 21:49:14
Problema Jocul Flip Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 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]]*(-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(ss+sum+a[lin[j]][0]*(-1)>ss)ss+=sum+a[lin[j]][0]*(-1);
            }
            if(s+ss*2>maxx)maxx=ss*2+s;
            if(k<nrc)bckc(k+1,si+a[0][col[i]]*(-1));
        }
       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;
}