Cod sursa(job #1482047)

Utilizator theprdvtheprdv theprdv Data 5 septembrie 2015 21:38:33
Problema Elimin Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#define _CRT_SECURE_NO_DEPRECATE
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <algorithm>
#define MAXN 7300

int N, M, R, C, A[MAXN][MAXN];
int RSum[MAXN], LSum[MAXN], maxx, Tsum, minn = 0x3f3f3f3f;
int in[MAXN];

inline bool cmp(int x, int y) { return x < y; }

inline bool check(int i, int lim){
	int x = i, j = 0;
	for (; x; x -= x & -x, ++j);
	return j == lim;
}

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

	scanf("%d %d %d %d", &M, &N, &R, &C);
	//assert((M < N ? M : N) < 32);

	for (int i = 0; i < M; ++i)
		for (int j = 0; j < N; ++j)
			scanf("%d", &A[i][j]),
			RSum[j] += A[i][j],
			LSum[i] += A[i][j],
			Tsum += A[i][j];

	if (M <= N){
		for (int i = 1; i < 1 << M; ++i){ // back on rows
			if (!check(i, R)) continue;

			int sum = 0;
			for (int j = 0; j < N; ++j) in[j] = RSum[j];

			for (int j = 0; j < M; ++j) // for each bit of i
				if (i & (1 << j)){
					sum += LSum[j];
					for (int k = 0; k < N; ++k)
						in[k] -= A[j][k];
				}
			std::sort(in, in + N, cmp);
			for (int j = 0; j < C; ++j) sum += in[j];
			if (sum < minn) minn = sum;
		}
	}
	else { // back on columns
		for (int i = 1; i < 1 << N; ++i){
			if (!check(i, C)) continue;

			int sum = 0;
			for (int j = 0; j < M; ++j) in[j] = LSum[j];

			for (int row = 0; row < M; ++row){
				for (int j = 0; j < N; ++j)
					if (i & (1 << j)){
						if (!row) sum += RSum[j];
						in[row] -= A[row][j];
					}
			}

			std::sort(in, in + M, cmp);
			for (int j = 0; j < R; ++j) sum += in[j];
			if (sum < minn) minn = sum;
		}
	}

	printf("%d", Tsum - minn);
	return 0;
}