Cod sursa(job #1002428)

Utilizator robert_stefanRobert Stefan robert_stefan Data 27 septembrie 2013 18:46:15
Problema Elimin Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <fstream>
#include <algorithm>
#define IN "elimin.in"
#define OUT "elimin.out"

using namespace std;

ifstream in(IN);
ofstream out(OUT);

int r, c, sol[7295], a[7295][7295], sc[7295], sl[7295], sumtot, sc2[7295], mx, soll, n, m;

inline void write()
{
	out<<mx<<'\n';
}

inline void read()
{
	in>>n>>m>>r>>c;
	int i, j;
	for(i=1; i<=n; ++i)
		for(j=1; j<=m; ++j)
		{
			in>>a[i][j];
			sl[i]+=a[i][j];
			sc[j]+=a[i][j];
			//sc2[j]+=a[i][j];
			sumtot+=a[i][j];
		}
}

inline void greedy()
{
	sort(sc+1, sc+n+1);
	int i=1;
	for(; i<=c; ++i)
		soll-=sc2[i];//se scade coloana i
	if(soll>mx)
		mx=soll;
}

inline void solution()
{
	int i=1, j=1;
	soll=sumtot;
	
	for(; i<=m; ++i)
		sc2[i]=sc2[i];
	
	for(i=1; i<=r; ++i)
		for(; j<=m; ++j)
		{
			soll-=sl[sol[i]];
			sc2[j]-=a[sol[i]][j];
		}
	//s-au sters liniile
	if(c)
	{
		greedy();
	}
	else 
		if(soll>mx)
			mx=soll;
}

inline void BT(int k)//combinari de n luate cate r
{
	if(k==r+1)
		solution();
	else
	{
		sol[k]=sol[k-1];
		while(sol[k]<n-r+k)
		{
			++sol[k];
			BT(k+1);
		}
	}
}

int main()
{
	read();
	if(r)
		BT(1);
	else
	{
		soll=sumtot;
		greedy();
	}
	write();
	in.close();
	out.close();
	return 0;
}