Pagini recente » Cod sursa (job #3322635) | Cod sursa (job #835084) | Cod sursa (job #3310166) | Cod sursa (job #1169044) | Cod sursa (job #3352478)
/**
Observatia principala:
- are sens sa facam flip de 2 ori pe aceeasi linie (sau aceeasi coloana) ?
Raspus: Nu pentru ca e acelasi lucru ca si cand nu facem deloc flip.
Fiecarei linii si fiecarei coloane fie nu ii facem deloc flip fie ii facem o singura data.
imi aleg o dimensiune, sa zicem coloanele. Numarul de coloane este mic si voi analiza toate modurile
de a face flip pe coloane
0 0 0
4 -2 2
3 -1 5
2 0 -3
4 1 -3
5 -3 2
0 0 1
4 -2 -2
3 -1 -5
2 0 +3
4 1 +3
5 -3 -2
0 1 0
4 +2 2
3 +1 5
2 0 -3
4 -1 -3
5 +3 2
0 1 1
4 +2 -2
3 +1 -5
2 0 +3
4 -1 +3
5 +3 -2
...
1 1 1
-4 +2 -2
-3 +1 -5
-2 0 +3
-4 -1 +3
-5 +3 -2
Costa mult sa iau in calcul toate aceste configuratii ? R: 2 la 16 maxim (inmultit cu n*m)
**/
#include <fstream>
using namespace std;
int a[16][16], c[16][16];
int n, m, i, j, b, k, slin, scurent, smax;
int main () {
ifstream fin ("flip.in");
ofstream fout("flip.out");
fin>>n>>m;
for (i=0;i<n;i++)
for (j=0;j<m;j++)
fin>>a[i][j];
/// iau k de la 0 la numar de coloane - 1
for (k=0;k<(1<<m);k++) {
/// aplic flip pe coloane conform scrierii in baza 2 a lui k
/// mai intereseaza bitii lui k de la 0 la m-1
for (i=0;i<n;i++)
for (j=0;j<m;j++)
c[i][j] = a[i][j];
/// ma intereseaza bitii 1 din scrierea in baza 2 a lui k
for (b=0;b<m;b++) {
if ((k>>b) & 1) {
/// fac flip la coloana b din matrice (dar intr-o matrice copie)
for (i=0;i<n;i++)
c[i][b] = -c[i][b];
}
}
/// pentru masca curenta de flip aplicata pe coloane
/// liniilor care au suma negativa le fac flip si pe celelalte le las asa
scurent = 0;
for (i=0;i<n;i++) {
slin = 0;
for (j=0;j<m;j++)
slin += c[i][j];
if (slin < 0)
scurent -= slin;
else
scurent += slin;
}
if (scurent > smax)
smax = scurent;
/**
for (i=0;i<n;i++) {
for (j=0;j<m;j++)
fout<<c[i][j]<<" ";
fout<<"\n";
}
fout<<"\n";
**/
}
fout<<smax;
}
/**
Timp de calcul de ordin ((2 la m) * n * m).
65000 * 256
2 la 24 = 16 milioane, OK!
**/