Cod sursa(job #195828)

Utilizator CommanderKUPB - Andrei Homescu CommanderK Data 22 iunie 2008 00:26:54
Problema Jocul Flip Scor 100
Compilator c Status done
Runda Arhiva de probleme Marime 1.15 kb
#include <stdio.h>
#include <stdlib.h>

#define MAXN 16

int n, m;
int a[MAXN][MAXN];
long long sl[MAXN + 2], cl[MAXN + 2];

int main( )
{
    freopen( "flip.in", "r", stdin );
    freopen( "flip.out", "w", stdout );

    int i, j, k;
    scanf( "%d%d", &n, &m );
    for( i = 0 ; i < n ; i++ )
        for( j = 0 ; j < m ; j++ )
            scanf( "%d", &a[i][j] );

    long long res = -(1LL << 30);
    for( k = 0 ; k < (1 << m) ; k++ )
    {
        sl[0] = sl[n + 1] = 0LL;
        for( i = 1 ; i <= n ; i++ )
        {
            sl[i] = 0LL;
            for( j = 0 ; j < m ; j++ )
                if( k & (1 << j) )
                    sl[i] -= a[i - 1][j];
                else
                    sl[i] += a[i - 1][j];
        }

        cl[0] = 0LL;
        for( i = 1 ; i <= n + 1 ; i++ )
        {
            long long cSum = -sl[i];
            cl[i] = 0LL;
            for( j = i - 1 ; j >= 0 ; j-- )
            {
                if( cl[j] + cSum > cl[i] )
                    cl[i] = cl[j] + cSum;
                cSum += sl[j];
            }
        }
        if( cl[n + 1] > res )
            res = cl[n + 1];
    }
    printf( "%lld\n", res );
    return 0;
}