RT,这是调这份代码的第8节课了,球球了/kk https://www.luogu.com.cn/record/128190842
#include<iostream>
#include<cstdio>
#include<vector>
#define pb push_back
#include<unordered_map>
using namespace std;
namespace INPUT{
char buf[1<<20],*p1,*p2;
#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
}
using namespace INPUT;
template <typename T>
T read(){
T x=0,p=1;
char ch=gc();
for(;ch<'0'||ch>'9';ch=gc())
if(ch=='-') p=-1;
for(;'0'<=ch&&ch<='9';ch=gc())
x=(x<<3)+(x<<1)+(ch^48);
return x*p;
}
const int N=10;
unordered_map<int,int>last,now;
int bits[N];
int n,_map[N][N];
void print(int x){
for(int i=1;i<=n;i++)
printf("%d",(x>>(bits[i]))%8);
}
int main(){
// freopen("P3886.in","r",stdin);
// freopen("P3886.out","w",stdout);
for(int i=0;i<N;i++) bits[i]=i*3;
n=read<int>();
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)
_map[i][j]=read<int>();
int ans=-1e9;
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++)
ans=max(ans,_map[i][j]);
if(ans<0) return printf("%d\n",ans),0;
now[0]=0;
auto put=[](int state,int val){
if(!now.count(state)) now[state]=val;
now[state]=max(now[state],val);
};
auto encode=[&ans](int state,int res){
int vis[N];
for(int i=1;i<=n;i++) vis[i]=0;
int cnt=0;
for(int i=1;i<=n;i++){
int x=(state>>bits[i])%8;
if(x==0) continue;
if(!vis[x]) vis[x]=++cnt;
state+=vis[x]*(1<<bits[i])-x*(1<<bits[i]);
}
if(cnt<2) ans=max(ans,res);
return state;
};
for(int i=1;i<=n;i++) for(int j=1;j<=n;j++){
swap(last,now),now.clear();
for(auto ed:last){
int state=ed.first,lastans=ed.second;
int b1=(state>>bits[j-1])%8,b2=(state>>bits[j])%8;
if(j==1) b1=0;
if(b1==0&&b2==0){
put(encode(state,lastans),
lastans);
put(encode(state+7*(1<<bits[j]),lastans+_map[i][j]),
lastans+_map[i][j]);
}
else if(b1&&b2==0){
put(encode(state,lastans),
lastans);
put(encode(state+b1*(1<<bits[j]),lastans+_map[i][j]),
lastans+_map[i][j]);
}
else if(b1==0&&b2){
int cnt=0;
for(int k=1;k<=n;k++)
if((state>>bits[k])%8==b2) cnt++;
if(cnt>=2)
put(encode(state-b2*(1<<bits[j]),lastans),
lastans);
put(encode(state,lastans+_map[i][j]),
lastans+_map[i][j]);
}
else if(b1&&b2){
int cnt=0;
for(int k=0;k<=n;k++)
if((state>>bits[k])%8==b2) cnt++;
if(cnt>=2)
put(encode(state-b2*(1<<bits[j]),lastans),
lastans);
for(int k=1;k<=n;k++) if((state>>bits[k])%8==b1)
state+=b2*(1<<bits[k])-b1*(1<<bits[k]);
put(encode(state,lastans+_map[i][j]),
lastans+_map[i][j]);
}
else puts("?");
}
}
cout<<ans<<endl;
}