1 条题解

  • 3
    @ 2024-5-22 19:20:06
    #include<bits/stdc++.h>
    using namespace std;
    #define maxn 25
    #define inf 0x3f3f3f3f
    template <typename Tp>
    inline void read(Tp &x){
    	x=0;int f=1;char c=getchar();
    	while(c>'9'||c<'0'){if(c=='-')f=-1;c=getchar();}
    	while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+(c&15);c=getchar();}x*=f;
    }
    int n,m,r,c,a[maxn][maxn],ch[maxn],ans=inf,up[maxn],lft[maxn][maxn],dp[maxn][maxn];
    int calc(){
    	memset(dp,0x3f,sizeof(dp));
    	int ret=inf;
    	for(int i=1;i<=m;i++){
    		dp[i][1]=up[i];
    		for(int j=2;j<=c;j++)
    			for(int k=1;k<i;k++)
    				dp[i][j]=min(dp[i][j],dp[k][j-1]+up[i]+lft[k][i]);
    		ret=min(ret,dp[i][c]);
    	}
    	return ret;
    }
    void pre(){
    	memset(up,0,sizeof(up));
    	memset(lft,0,sizeof(lft));
    	for(int i=1;i<r;i++)
    		for(int j=1;j<=m;j++)
    			up[j]+=abs(a[ch[i]][j]-a[ch[i+1]][j]);
    	for(int i=1;i<=m;i++)
    		for(int j=i+1;j<=m;j++)
    			for(int k=1;k<=r;k++)
    				lft[i][j]+=abs(a[ch[k]][i]-a[ch[k]][j]);
    }
    void dfs(int step){
    	if(step==r+1){
    		pre();
    		ans=min(ans,calc());
    		return;
    	}
    	for(int i=ch[step-1]+1;i<=n;i++){
    		ch[step]=i;
    		dfs(step+1);
    		ch[step]=0;
    	}
    }
    int main(){
    	read(n);read(m);read(r);read(c);
    	for(int i=1;i<=n;i++)
    		for(int j=1;j<=m;j++)
    			read(a[i][j]);
    	dfs(1);
    	printf("%d\n",ans);
    	return 0;
    }
    
    • 1

    信息

    ID
    1459
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    25
    已通过
    14
    上传者