原文链接:https://ac.nowcoder.com/acm/problem/16503
AC代码:
#include<iostream>
#include<string.h>
#include<vector>
#include<math.h>
#include<algorithm>
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<<i<<" "<<j<<" "<<f[i][j]<<endl;
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;
}