Cod sursa(job #2314621)

Utilizator richard26Francu Richard richard26 Data 8 ianuarie 2019 21:00:53
Problema Elimin Scor 90
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.12 kb
#include <bits/stdc++.h>
#define N 8000

using namespace std;

int a[N][N], sl[N], sc[N], save_bt[N], s, n, m, r, c, maxi, v[N];



void calcul()
{
	int i, j, d[N], s1 = 0, s2 = 0;
	for (i = 1; i <= m; i++)
		d[i] = sc[i];
	for (i = 1; i <= r; i++)
	{
		for (j = 1; j <= m; j++)
		{
			d[j] = d[j] - a[v[i]][j];
		}
	}

	for (i = 1; i <= r; i++)
		s1 += sl[v[i]];
	sort(d + 1, d + m + 1);
	for (i = 1; i <= c; i++)
		s2 += d[i];
	if(s - s1 - s2 > maxi)
		maxi = s - s1 - s2;
}

void bt(int k)
{
	int i;
	for (i = v[k - 1] + 1; i <= n; i++)
	{
		v[k] = i;
		if(k == r)
		{
			calcul();
		}
		else
		{
			bt(k + 1);
		}
	}
}


int main()
{	
	ifstream f("elimin.in");
	ofstream g("elimin.out");
	f>>n>>m>>r>>c;
	int i, j;
	if (n <= m)
	{
		for (i = 1; i <= n; i++)
		{
		
			for (j = 1; j <= m; j++)
			{
				f>>a[i][j];
			}
			
		}
	}

	else {
		for (i = 1; i <= n; i++)
			for (j = 1; j <= m; j++)
			{
				f>>a[j][i];
			}
		swap(n, m);
		swap(r, c);
	}
	

	for (i = 1; i <= n; i++)
		for(j = 1; j <= m; j++)
		{
			sl[i] += a[i][j];
			sc[j] += a[i][j];
			s += a[i][j];
		}


	if(r == 0) g<<s;
	 else
	 {
	 	bt(1);
	 	g<<maxi;
	 }
	return 0;
}