bfs+动态规划——子矩阵

原文链接:https://ac.nowcoder.com/acm/problem/16503

bfs+动态规划——子矩阵_第1张图片
bfs+动态规划——子矩阵_第2张图片

bfs+动态规划——子矩阵_第3张图片

AC代码:

#include
#include
#include
#include
#include
using namespace std;
int mapp[20][20],n,m,r,c,ans=2147483647;
int lc[20],hc[20][20],f[20][20],visit[20];
vector<int> vec;
void Memset(){
	int i,j,k;
	memset(lc,0,sizeof(lc));
	memset(hc,0,sizeof(hc));
	for(i=1;i<vec.size();i++){
		for(j=1;j<=m;j++){
			lc[j]+=abs(mapp[vec[i]][j]-mapp[vec[i-1]][j]);
		}
	}
	for(i=1;i<=n;i++){
		for(j=i+1;j<=m;j++){
			for(k=0;k<vec.size();k++){
				hc[i][j]+=abs(mapp[vec[k]][i]-mapp[vec[k]][j]);
			}
		}
	}
}
void Memean(){
	int i,j,k;
	f[1][1]=lc[1];
	for(i=1;i<=n;i++){
		for(j=1;j<=i&&j<=c;j++){
			f[i][j]=2147483647;
			if(j==1){
				f[i][j]=lc[i];
			}
			else if(i==j){
				f[i][j]=f[i-1][j-1]+lc[i]+hc[i-1][j];
			}
			else{
				for(k=j-1;k<i;k++){
					f[i][j]=min(f[i][j],f[k][j-1]+lc[i]+hc[k][i]);
				}
			}
			//cout<
			if(j==c){
				ans=min(ans,f[i][j]);
			}
		}
	}
}
void dfs(int num,int now){
	int i,j;
	if(num==r){
		Memset();
		Memean();
		return ;
	}
	for(i=now;i<=n;i++){
		if(visit[i]==1) continue;
		visit[i]=1;
		vec.push_back(i);
		dfs(num+1,i);
		vec.pop_back();
		visit[i]=0;
	}
}
int main(){
	int i,j;
	cin>>n>>m>>r>>c;
	memset(mapp,0,sizeof(mapp));
	memset(visit,0,sizeof(visit));
	for(i=1;i<=n;i++){
		for(j=1;j<=m;j++){
			cin>>mapp[i][j];
		}
	}
	dfs(0,1);
	cout<<ans<<endl;
	return 0;
}

你可能感兴趣的:(BFS)