Cod sursa(job #1019450)

Utilizator UnforgivenMihai Catalin Botezatu Unforgiven Data 31 octombrie 2013 09:26:55
Problema Elimin Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <iostream>
#include <fstream>
#include <algorithm>
#include <string.h>


const static int NMAX = 7294;

using namespace std;

int nr_linii , nr_coloane , matrix[NMAX][NMAX];
int R , C;

bool col_select[NMAX];
int solutie[NMAX];

int sum_linii[NMAX] , aux_sum_linii[NMAX];
int sum_matrix = 0;
int max_suma = -1;

ifstream input("elimin.in");
ofstream output("elimin.out");


void backtrack(int pos)
{
	if (pos == C)
	{
		int sum = 0;
		
		memset(aux_sum_linii , 0 , sizeof(int) * nr_linii);

		for (int j = 0;j<pos;j++)
			for (int i = 0;i<nr_linii;i++)
			{
				sum += matrix[i][solutie[j]];
				aux_sum_linii[i] += matrix[i][solutie[j]];
			}
		for (int i = 0;i<nr_linii;i++)
			aux_sum_linii[i] = sum_linii[i] - aux_sum_linii[i];

		sort(aux_sum_linii , aux_sum_linii + nr_linii);

		for (int i = 0;i<R;i++)
			sum += aux_sum_linii[i];

		if (sum_matrix - sum > max_suma)
			max_suma = sum_matrix - sum;		

	}
	else
	{
		for (int i = 0;i<nr_coloane;i++)
		{
			if (!col_select[i])
			{
				col_select[i] = true;
				solutie[pos] = i;
				backtrack(pos+1);
				col_select[i] = false;				
			}
		}
	}
}



int main(int argc , char ** argv)
{
	input >> nr_linii >> nr_coloane >> R >> C;

	int sum = 0;

	for (int i = 0;i<nr_linii;i++)
	{
		sum = 0;
		for (int j = 0;j<nr_coloane;j++)
		{

			input >> matrix[i][j];
			sum_matrix += matrix[i][j];
			sum += matrix[i][j];
		}
		sum_linii[i] += sum;
	}

	memset(col_select , false , nr_coloane * sizeof(bool));



	backtrack(0);

	cout << max_suma;

	return 0;
}