Cod sursa(job #504492)

Utilizator RobytzzaIonescu Robert Marius Robytzza Data 27 noiembrie 2010 21:27:55
Problema Elimin Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.6 kb
#include <stdio.h>
#include <algorithm>
#define IN "elimin.in"
#define OUT "elimin.out"

using namespace std;

const int L = 1000;

int R, C, N, M;
int Mat[L][L];
int mat[L][L];
int col[L], Col[L], Lin[L];
int Rez;
int S;

void Read()
{
    scanf ("%d %d %d %d", &N, &M, &R, &C);

    for (int i = 0  ; i < N ; i++)
        for (int  j = 0 ; j < M ; j++)
        {
            scanf ("%d", &Mat[i][j]);
            S += Mat[i][j];
            Lin[i] += Mat[i][j];
            Col[j] += Mat[i][j];
        }
}

void Flip()
{
    for (int  i = 0 ; i < M ; i++)
        for (int  j = 0 ; j < N ;j++)
            mat[i][j] = Mat[j][i];

    N^=M^=N^=M;

    for (int  i = 0 ; i < N ; i++)
        for (int  j = 0 ; j < M ;j++)
            Mat[i][j] = mat[j][i];
}

void Check(int P)
{
    int S1 = S;
    for (int i = 0 ; i < M ; i++)
        col[i] = Col[i];

    for (int  j = 0 ; j < N ;j++)
    {
        if ((P>>j)&1)
        {
            S1 -= Lin[j];
            for (int i = 0 ; i < M ; i++)
                col[i] -= Mat[j][i];
        }
    }

    sort(col, col + M);

    for (int i = 0 ; i < C ; i++)
        S1 -= col[i];
    if (S1 > Rez)
        Rez = S1;
}

void Solve()
{
    int nr = 0;
    for (int i = 0 ; i<(1<<N) ;i++)
    {
        nr = 0;
        for (int  j = 0 ; j < N ;j++)
            nr += (i>>j)&1;
        if (nr == R)
            Check(i);
    }
    printf("%d\n", Rez);
}

int main()
{
    freopen (IN, "r", stdin);
    freopen (OUT, "w", stdout);
    Read();
    if (M < N)
        Flip();
    Solve();
    return 0;
}