Time Limit: 2000MS | Memory Limit: 30000K | |
Total Submissions: 3845 | Accepted: 1993 |
Description
You can do the SHIFT operation at arbitrary row, and as many times as you like. Your task is to minimize
Input
Output
Sample Input
2 4 6 3 7 3 1 2 3 4 5 6 7 8 9 -1
Sample Output
11 15
题意:一个矩阵经过变换之后(变换规则如上图),每次都有一个每一列的最大值,现在求解所有的这些变换中最大值的最小值。
题解:最多7^7。。所以深搜。
#include<cstdio> #include<cstring> #include<algorithm> #include<math.h> #include<queue> #include<iostream> using namespace std; const int INF = 999999999; int M[10][10]; int n,res; int now(){ int MAX = -INF; for(int i=1;i<=n;i++){ int sum = 0; for(int j=1;j<=n;j++){ sum=sum+M[j][i]; } if(sum>MAX) MAX = sum; } return MAX; } void _move(int k){ ///移动第k行 int temp = M[k][n]; for(int i=n;i>1;i--){ M[k][i] = M[k][i-1]; } M[k][1] = temp; } void dfs(int step){ ///当前移动第step行 if(step==n+1) { return; } int MAX = now(); if(MAX<res) res = MAX; for(int i=1;i<=n;i++){ #移动 n 次枚举该行移动的所有状态 _move(step); dfs(step+1); } } int main() { while(scanf("%d",&n)!=EOF,n!=-1){ res = INF; for(int i=1;i<=n;i++){ for(int j=1;j<=n;j++){ scanf("%d",&M[i][j]); } } dfs(1); printf("%d\n",res); } return 0; }