1 条题解
-
3
#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
- 上传者