Cod sursa(job #3342197)

Utilizator TimofeiFilipTimofei Filip Emanuel TimofeiFilip Data 23 februarie 2026 12:25:22
Problema Jocul Flip Scor 70
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.44 kb
#include <algorithm>
#include <cstdio>
using namespace std;

const int NMAX = 20;
typedef long long int ll;

ll matrix[NMAX][NMAX], maximum_score, matrix_copy[NMAX][NMAX];
int solution[NMAX];
int lines, columns;

void print_solution(ll n) {
    for (int i = 1; i <= n; i++) {
        printf("%d ", solution[i]);
    }
    printf("\n");
}
void copy_matrix() {
    for (int i = 1; i <= lines; i++) {
        for (int j = 1; j <= columns; j++) {
            matrix_copy[i][j] = matrix[i][j];
        }
    }
}
ll get_sum() {
    ll result = 0;
    for (int i = 1; i <= lines; i++)
        for (int j = 1; j <= columns; j++)
            result += matrix_copy[i][j];

    return result;
}
ll get_score(int n, char type_flip) {
    copy_matrix();
    if (type_flip == 'C') {
        for (int j = 1; j <= n; j++)
            for (int i = 1; i <= lines; i++)
                matrix_copy[i][solution[j]] *= -1;
        for (int i = 1; i <= lines; i++) {
            ll line_sum = 0;
            for (int j = 1; j <= columns; j++)
                line_sum += matrix_copy[i][j];
            if (line_sum >= 0) continue;
            for (int j = 1; j <= columns; j++)
                matrix_copy[i][j] *= -1;
        }
    }
    else {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= columns; j++) {
                matrix_copy[solution[i]][j] *= -1;
            }
        }
        for (int j = 1; j <= columns; j++) {
            ll column_sum = 0;
            for (int i = 1; i <= lines; i++) {
                column_sum += matrix_copy[i][j];
            }
            if (column_sum >= 0) continue;
            for (int i = 1; i <= lines; i++) {
                matrix_copy[i][j] *= -1;
            }
        }
    }
    ll result = get_sum();
    return result;
}

void submultimi(int &n, int position, char type_flip) {
    if (n + 1 == position) return;
    for (int i = solution[position - 1] + 1; i <= n; i++) {
        solution[position] = i;
        maximum_score = max(get_score(n, type_flip), maximum_score);
        submultimi(n, position + 1, type_flip);
    }
}

int main() {
    freopen("flip.in", "r", stdin);
    freopen("flip.out", "w", stdout);


    scanf("%d %d", &lines, &columns);

    for (int i = 1; i <= lines; i++)
        for (int j = 1; j <= columns; j++)
            scanf("%lld", &matrix[i][j]);
    if (lines <= columns)
        submultimi(lines, 1, 'L');
    else
        submultimi(columns, 1, 'C');
    printf("%lld", maximum_score);
    return 0;
}