← Home
#include <bits/stdc++.h>
using namespace std;
 
int t;
int n, m;
int a[5][105];
int dp[105][1 << 5];
 
int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    cin >> t;
    while (t--) {
        cin >> n >> m;
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                cin >> a[i][j];
            }
        }
        
        int S = 1 << n;
        memset(dp, -0x3f, sizeof(dp));
        dp[0][0] = 0;
        
        // 枚举每一列
        for (int i = 0; i < m; i++) {
            for (int k = 0; k < S; k++) {
                if (dp[i][k] < -1e8) continue;
                // 枚举第i列负责的行集合s
                for (int s = 0; s < S; s++) {
                    if (k & s) continue;  // 有交集,跳过
                    // 实时计算第i列对集合s的最优值
                    int best = 0;
                    for (int p = 0; p < n; p++) {  // 枚举旋转
                        int sum = 0;
                        for (int j = 0; j < n; j++) {
                            if (s >> j & 1) {
                                sum += a[(j - p + n) % n][i];
                            }
                        }
                        best = max(best, sum);
                    }
                    int nk = k | s;
                    dp[i + 1][nk] = max(dp[i + 1][nk], dp[i][k] + best);
                }
            }
        }
        cout << dp[m][S - 1] << endl;
    }
    return 0;
}