题意:一个n*n的数字矩阵,每次操作可以对任意一行或者一列进行循环移动,操作次数任意。求每种情况每一列的最大值的最小值。
思路:最大值最小化。n最多只有7,所以想着暴力试试,枚举任意行所有的状态求最大值再求最小值。不过这样算的复杂度7^14,竟然也过了。。
int n,a[10][10],sum[10];
int mi;
void dfs(int r)
{
if(r==n-1)
{
int ma=-INF;
for(int i=0;i<n;i++)//最后一行不变;
ma=max(sum[i],ma);
mi=min(mi,ma);
return ;
}
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)//每个元素右移i个位置;
{
int jj=(j+i)%n;
sum[jj]+=a[r][j];
}
dfs(r+1);
for(int j=0;j<n;j++)//回溯时减回去,不然会爆栈
{
int jj=(j+i)%n;
sum[jj]-=a[r][j];
}
}
}
int main()
{
while(~scanf("%d",&n)&&n!=-1)
{
memset(sum,0,sizeof(sum));
for(int i=0; i<n; i++)
for(int j=0; j<n; j++)
scanf("%d",&a[i][j]);
for(int i=0;i<n;i++)//最后一行不变;
sum[i]+=a[n-1][i];
mi=INF;
dfs(0);
printf("%d\n",mi);
}
return 0;
}
/*****************************************
***************** LYQ ***************
***************** YES ***************
*UserID: secrecy *
*RunOJ: *
*RunID: *
*Submit time: *
*Language: G++ *
*Result: Accepted *
*time: *
*Memory: *
*Length: *
*School: NYIST *
*Blog: http://blog.csdn.net/nyist_tc_lyq *
*QQ: *
*Tel: *
*****************************************/