Cod sursa(job #2581815)

Utilizator GeorgeComanaGeorgian Marian Comana GeorgeComana Data 15 martie 2020 20:23:03
Problema Jocul Flip Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.27 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;

vector<vector<int>> flipMatrix (ifstream &f, int *n, int *m) {
    vector<vector<int>> flipM;
    f >> *n >> *m;
    for (int i = 0; i < *n; ++i) {
        vector<int> auxV;
        for (int j = 0; j < *m; ++j) {
            int aux;
            f >> aux;
            auxV.push_back(aux);
        }
        flipM.push_back(auxV);
    }
    // for (int i = 0; i < *n; ++i) {
    //     for (int j = 0; j < *m; ++j) {
    //         cout << flipM.at(i).at(j) << " ";
    //     }
    //     cout << endl;
    // }
    return flipM;
}

int sumLine(vector<vector<int>> matrix, int line, int collumn, int *n, int *m) {
    if (line) {
        int sum = 0;
        for (int i = 0; i < *m; ++i) {
            sum += matrix.at(line).at(i);
        }
        return sum;
    }
    if (collumn) {
        int sum = 0;
        for (int i = 0; i < *n; ++i) {
            sum += matrix.at(i).at(collumn);
        }
        return sum;
    }
    return 0;
}
int sumMatrix(vector<vector<int>> matrix, int *n, int *m) {
    int sum = 0;
    for (int i = 0; i < *n; ++i) {
        for (int j = 0; j< *m; ++j) {
            sum += matrix.at(i).at(j);
        }
    }
    return sum;
}

int maxMatrix(vector<vector<int>> matrix, int *n, int *m) {
    int max = sumMatrix(matrix, n, m);
    int dp[*n + 1][*m + 1];
    for(int i = 0; i < *n + 1; ++i) {
        for (int j = 0; j < *m + 1; ++j) {
            dp[i][j] = max;
        }
    }
    for(int i = 1; i < *n + 1; ++i) {
        int sum1 = sumLine(matrix, i - 1, 0, n, m);
        for (int j = 1; j < *m + 1; ++j) {
            int sum2 = sumLine(matrix, 0, j - 1, n , m);
            dp[i][j] = std :: max(std :: max(dp[i - 1][j - 1] - 2 * sum1, dp[i - 1][j - 1] - 2 * sum2), dp[i - 1][j - 1] - 2 * sum1 - 2 * sum2);
        }
    }
    int maxi = 0;
    for(int i = 0; i < *n + 1; ++i) {
        for (int j = 0; j < *m + 1; ++j) {
            if (dp[i][j] > maxi) {
                maxi = dp[i][j];
            }
        }
    }
    return maxi;
}
int main() {
    ifstream f("flip.in");
    ofstream g("flip.out");
    int *n = (int*) malloc(sizeof(int) * 1);
    int *m = (int*) malloc(sizeof(int) * 1);
    vector<vector<int>> flipM = flipMatrix(f, n, m);
    g << maxMatrix(flipM, n, m);
    return 0;
}