这道题是说给你一个最大8*8的矩阵,每次你可以交换两行或两列,让它的行优先遍历的字典序最小。。
实际上很简单,前天我钻研了楼教主的部分搜索的论文,这道题目实际上部分搜索就可以了,只要列的排列顺序确定了,行只要排个序就可以了。。
那么效率就是(n!*n^2*logn)对付这题n=8足够了。。
晕。。真的不能再搞编程了。。还有1个星期就要数学竞赛了天啊。。神啊。保佑我吧囧。。
#include <vector>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#include <algorithm>
#include <functional>
#include <numeric>
#include <utility>
#include <sstream>
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
#define rep(i,n) for(int i=0;i<n;i++)
#define pb push_back
#define tr(i,x) for(typeof(x.begin()) i=x.begin();i!=x.end();i++)
#define all(x) x.begin(),x.end()
const int inf=~0U>>1;
using namespace std;
typedef pair<int,int> ii;
typedef vector<int> vi;
typedef vi::iterator vit;
class MatrixGame {
public:
vector <string> getMinimal(vector <string>);
};
int n,m;
vector<string> tmp,M,ans;
bool used[10]={0};
void dfs(int p)
{
if(p==m)
{
vector<string> t=tmp;
sort(all(t));
ans=min(ans,t);
return;
}
rep(i,m)if(!used[i])
{
used[i]=true;
rep(j,n) tmp[j][p]=M[j][i];
dfs(p+1);
used[i]=false;
}
}
vector <string> MatrixGame::getMinimal(vector <string> _M) {
ans=M=_M;
n=M.size();m=M[0].size();
tmp.resize(n);rep(i,n)tmp[i].resize(m);dfs(0);
return ans;
}
//Powered by [KawigiEdit] 2.0!
若是这个复杂度的话 根本不用搜索 直接对列进行全排列 行排序 取最小值即可
神牛数学竞赛加油!!
回复abilitytao:晕。。我不就是这么做的么囧。
回复bonism5604:唉。。现在搞数学一点心思都没有。。满脑子都是OI。。估计要大悲剧了。。
求部分搜索的论文daizhenyang@gmail.com谢谢