先找出25大 然后dfs求最大值
#include<bits/stdc++.h>
#include<deque>
using namespace std;
#define IO ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
#define forn(i,n) for(int i=0;i<n;i++)
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
typedef long long ll;
const int INF=0x3f3f3f3f;
const ll inf=0x3f3f3f3f3f3f3f3f;
const int mod=1e9+7;
const ll MOD=998244353;
const int maxn=2e5+5;
int a[maxn][5],vis[maxn];
int ww[15][15]; //每列前5大 横坐标
ll ans=0;//5e9
void dfs(int now,ll tmp){
if(now==6)
{
ans=max(tmp,ans);
return;
}
rep(i,1,5){ //当前列 5行 25个数
if(vis[ww[i][now]])
continue;
vis[ww[i][now]]=1;//当前列第i=1大取了 之后几列不能取同一行
dfs(now+1,tmp+a[ww[i][now]][now]);
vis[ww[i][now]]=0;
}
}
int main(){
int n;
cin>>n;
rep(i,1,n){
rep(j,1,5){
cin>>a[i][j];
rep(pos,1,5){ //慢慢排前5大
if(a[i][j]>a[ww[pos][j]][j]) //是否比已存在的第一大大 否则看是否比已存在的第二大大 第j列第pos大到底存在第几行
{
for(int k=5;k>=pos+1;k--){ //原先pos之后的 后移 到pos+1->5
ww[k][j]=ww[k-1][j];
}
ww[pos][j]=i; //第j列第pos大下标
break; //该数已定 找下一个 a[i][j]
}
else
continue;
}
}
}
dfs(1,0);
cout<<ans<<endl;
return 0;
}