Cod sursa(job #8357)

Utilizator fireatmyselfBogdan-Alexandru Stoica fireatmyself Data 24 ianuarie 2007 17:48:47
Problema Elimin Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.92 kb
#include <stdio.h>
#include <algorithm>
#include <vector>
#define NMAX 20
#define MMAX 8000

using namespace std;

int A[NMAX][MMAX], Sc[MMAX], N, M;
int C[NMAX][MMAX];
int Sum, Max, v[NMAX], R, L;
vector<pair<int, int> > S;

void linie()
{
        int i, j, s, n, p = (1<<N), k, ss;

        for (i = 1; i < p; i++)
        {
            for (j = 0; j < M; j++)
            {
                Sc[j] = 0;
                for (k = 0; k < N; k++) C[k][j] = A[k][j], Sc[j] += A[k][j];
            }

            n = 0;
            for (j = 0; j < N; j++)
                if (((i>>j)&1)) v[n++] = j;

            if (n == L)
            {
                s = Sum;
                for (k = 0; k < M; k++)
                {
                    for (j = 0; j < n; j++) s -= A[ v[j] ][k], C[ v[j] ][k] = 0, Sc[k] -= A[ v[j] ][k];
                    S.push_back(make_pair(Sc[k], k));
                }
                sort(S.begin(), S.end());
                for (j = 0; j < N; j++)
                    for (k = 0; k < R; k++)
                    {
                        s -= C[j][ S[k].second ];
                        C[j][ S[k].second ] = 0;
                    }
                if (s > Max) Max = s;
                S.clear();
            }
        }
}

int main()
{
        int i, j;

        freopen("elimin.in", "r", stdin);
        scanf("%d %d %d %d", &N, &M, &R, &L);

        if (N<=M)
        {
                for (i = 0; i < N; i++)
                    for (j = 0; j < M; j++) scanf("%d", &A[i][j]), Sum += A[i][j];
                linie();
        }
        else
        {
                for (i = 0; i < N; i++)
                    for (j = 0; j < M; j++) scanf("%d", &A[j][i]), Sum += A[j][i];
                i = N; N = M; M = i;
                linie();
        }

        freopen("elimin.out", "w", stdout);
        printf("%d\n", Max);

        return 0;
        
}