Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <map>
- #include <set>
- #include <queue>
- #include <algorithm>
- #include <string>
- #include <cmath>
- #include <cstdio>
- #include <iomanip>
- #include <fstream>
- #include <cassert>
- #include <cstring>
- #include <unordered_set>
- #include <unordered_map>
- #include <numeric>
- #include <ctime>
- #include <bitset>
- #include <complex>
- using namespace std;
- int n, m;
- vector<vector<int>> a;
- vector<int> cm;
- vector<vector<int>> prec;
- void init() {
- prec.clear();
- cm.clear();
- cm.resize(m);
- prec.resize(m, vector<int> (1 << n));
- for (int i = 0; i < m; i++) {
- for (int mask = 0; mask < (1 << n); mask++) {
- for (int dl = 0; dl < n; dl++) {
- int cur = 0;
- for (int j = 0; j < n; j++) {
- if ((mask >> j) & 1) {
- cur += a[(dl + j) % n][i];
- }
- }
- prec[i][mask] = max(prec[i][mask], cur);
- }
- }
- }
- }
- int solve(vector<int> wr) {
- int ans = 0;
- for (int i = 0; i < n; i++) {
- ans -= prec[wr[i]][cm[wr[i]]];
- cm[wr[i]] |= (1 << i);
- ans += prec[wr[i]][cm[wr[i]]];
- }
- for (int i = 0; i < n; i++) {
- cm[wr[i]] = 0;
- }
- return ans;
- }
- int ans = 0;
- void gen(vector<int> &wr) {
- if ((int)wr.size() == n) {
- ans = max(ans, solve(wr));
- } else {
- for (int i = 0; i < m; i++) {
- wr.push_back(i);
- gen(wr);
- wr.pop_back();
- }
- }
- }
- void solve() {
- a.clear();
- ans = 0;
- cin >> n >> m;
- a.resize(n, vector<int> (m));
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++) {
- cin >> a[i][j];
- }
- }
- init();
- int mx = -1;
- int mxj = -1;
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < m; j++) {
- if (mx < a[i][j]) {
- mx = a[i][j];
- mxj = j;
- }
- }
- }
- vector<int> wr = {mxj};
- gen(wr);
- cout << ans << '\n';
- }
- signed main() {
- ios_base::sync_with_stdio(false);
- cin.tie(0);
- int q;
- cin >> q;
- while (q--) {
- solve();
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement