我的剪枝啊!!
第一个样例太“水”了
#include<iostream>
using namespace std;
int n,ans,h[22],p[21][21],q[21][21];
bool vis[21];
void dfs(int step,int sum) {
if(step>n) {
ans=max(ans,sum);
return;
}
if(sum+h[step]<ans)return;
for(int i=1;i<=n;i++){
if(vis[i])continue;
vis[i]=1;
dfs(step+1,sum+p[step][i]*q[i][step]);
vis[i]=0;
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++){
cin>>p[i][j];
}
}
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++){
cin>>q[i][j];
}
}
for(int i=n;i>=1;i--){
int tmp=0;
for(int j=1;j<=n;j++){
tmp=max(p[i][j]*q[j][i],tmp);
}
h[i]=h[i+1]+tmp;
}
dfs(1,0);
cout<<ans;
return 0;
}