Cod sursa(job #1017367)

Utilizator BalcauIonutFMI-Balcau Ionut BalcauIonut Data 27 octombrie 2013 18:29:42
Problema Elimin Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.66 kb
#include <vector>
#include <algorithm>
#include <fstream>
#include <iostream>
using namespace std;

ifstream fin("elimin.in");
ofstream fout("elimin.out");

int n, m, r, c, sumt,**a;
int *sumc, *suml,*v;
int smin = 1<<30 ;

int greedy(bool lin) {
	vector<int> h;
	int  i;
	if (lin)
	{
		for (i = 1; i <= m; i++)
			h.push_back(sumc[i]);
	}
	else {
		for (i = 1; i <= n; i++)
			h.push_back(suml[i]);
	}
	sort(h.begin(), h.end());
	int s=0;

	if (lin)
	{

		for (i = 0; i < c; i++)
			s += h[i];
		return s;
	}
	else
	{
		for (i = 0; i < r; i++)
			s += h[i];
		return s;
	}
}

void back(int k, int nn, bool lin, int sum, int count) {

	int i;
	for (v[k] = v[k - 1] + 1; v[k] <= nn; v[k]++)
	{
		int s = 0;
		if (lin)
		{
			s = suml[v[k]];
			for (i = 1; i <= m; i++)
				sumc[i] -= a[v[k]][i];
		} else {
			s = sumc[v[k]];
			for (i = 1; i <= n; i++)
				suml[i] -= a[i][v[k]];
		}
		if (k == count)
		{
			s += sum;
			s += greedy(lin);
			if (s < smin)
				smin = s;
		}
		else
			back(k + 1, nn, lin, sum + s, count);
		if (lin)
			for (i = 1; i <= m; i++)
				sumc[i] += a[v[k]][i];
			else
				for (i = 1; i <= n; i++)
					suml[i] += a[i][v[k]];

	}

}

int main() {
	fin>>n>>m>>r>>c;
	// cerr<<n<<' '<<m<<' '<<r<<' '<<c<<'\n';
	a = new int*[n+1];
	suml = new int[n+1];
	sumc = new int[m+1];
	for (int i = 1; i <= n; i++)
	{
		a[i] = new int[m+1];

		for (int j = 1; j <= m; j++)
		{
			fin>>a[i][j];
			sumt += a[i][j];
			suml[i] += a[i][j];
			sumc[j] += a[i][j];
			// cerr<<a[i][j]<<' ';
		}
		// cerr<<'\n';
	}

	if (n < m)
	{
		v = new int[n+1];
		v[0] = 0;
		back(1, n, true, 0, r);
	}
	else
	{
		v = new int[m+1];
		v[0] = 0;
		back(1, m, false, 0, c);
	}
	fout<<sumt - smin;

}