Cod sursa(job #2639869)

Utilizator AndreiDeltaBalanici Andrei Daniel AndreiDelta Data 4 august 2020 13:04:17
Problema Jocul Flip Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.41 kb
#include <bits/stdc++.h>
using namespace std;
ifstream f("flip.in");
ofstream g("flip.out");
ofstream g1("pep.out");
typedef long long ll;
const int dim=(1<<20),po=1e5;
const ll inf=-2e9;
ll n,m,ans0,ans1,S;

int main()
{
    f>>n>>m;
   /* srand (time(NULL));
    int N=6,M=5;
    for(int i=1;i<=N;i++,g1<<'\n')
    for(int j=1;j<=M;j++)
    {
        ll v1=rand()%po+(-10000);g1<<v1<<' ';
    }*/

    vector < ll > sum(m+3,0),sum1(n+3,0);
    vector < vector < ll > > v(n+3,vector < ll > (m+4));
    vector < vector < ll >  > dp(4, vector < ll > (dim,inf));
    for(int i=0;i<n;i++)
        for(int j=0;j<m;j++)
        {
            f>>v[i][j];
            S+=v[i][j];
            sum[j]+=v[i][j];
            sum1[i]+=v[i][j];
        }

    dp[0][0]=0;
    for(int j=0;j<m;j++) dp[0][0]+=sum[j];

    ans0=S;
    for(int i=1;i<(1<<m);i++)
    {
        for(int j=0;(1<<j)<=i;j++)
        if( ( i & (1<<j) ) > 0 )
        {
            dp[0][i]=max(dp[0][i],dp[0][i^(1<<j)]-2*sum[j]);
        }
        ans0=max(ans0,dp[0][i]);
    }


    dp[1][0]=0;
    for(int i=0;i<n;i++) dp[1][0]+=sum1[i];

    ans1=S;
    for(int i=1;i<(1<<n);i++)
    {
        for(int j=0;(1<<j)<=i;j++)
        if( ( i & (1<<j) ) > 0 )
        {
            dp[1][i]=max(dp[1][i],dp[1][i^(1<<j)]-2*sum1[j]);
        }
        ans1=max(ans1,dp[1][i]);
    }

    g<<ans0+ans1-S;

    return 0;
}