Cod sursa(job #504502)

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

using namespace std;

const int L = 7294;

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

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

    Mat = (int **)malloc(N * sizeof(int*));
    for (int i = 0 ; i < N ; i++)
        Mat[i] = (int *)malloc(M * sizeof(int));

    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()
{
    mat = (int **)malloc(M * sizeof(int*));
    for (int i = 0 ; i < M ; i++)
        mat[i] = (int *)malloc(N * sizeof(int));

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

    free(Mat);

    N^=M^=N^=M;
    R^=C^=R^=C;

    Mat = (int **)malloc(N * sizeof(int*));
    for (int i = 0 ; i < N ; i++)
        Mat[i] = (int *)malloc(M * sizeof(int));

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

    free(mat);
}

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;
}