题目:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1418
虽然是个简单的DFS。。但是还是打了半天,题意很简单,就是对于每一行的数可以进行向右移动,每一行移动的次数可以为0,1,2.....n-1,
那么他的事件复杂度为7^7=823543.暴力DFS可以直接AC。
下面是AC代码:
#include<iostream>
using namespace std;
int ans,n;
void dfs(int row,int b[][10]){
int i,j;
if(row==n) return;
int s,max=-1000000,c[10][10];
for(i=0;i<n;i++){
s=0;
for(j=0;j<n;j++)
s+=b[j][i];
if(s>max) max=s;
}
//cout<<s<<endl;
if(max<ans) ans=max;
//cout<<ans<<endl;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
c[i][j]=b[i][j];
for(i=0;i<n;i++){
for(j=0;j<n;j++){
if(j-i<0)
c[row][j]=b[row][j-i+n];
else
c[row][j]=b[row][j-i];
}
dfs(row+1,c);
}
}
/*void solve(int a[][10]){
int i,j;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
a[i][j]+=10;
}
*/
int main(){
int i,j;
int a[10][10];
while(cin>>n&&n>0){
ans=10000*100;
for(i=0;i<n;i++)
for(j=0;j<n;j++) cin>>a[i][j];
dfs(0,a);
cout<<ans<<endl;
}
return 0;
}