1 条题解
-
0
C++ :
#include<stdio.h> #include<string.h> int n,m,r,c; int mp[20][20]; int chose[20]; int dp[20][20]; int res=0x3f3f3f3f; inline int myabs(int a){ return a>=0?a:-a; } inline int mymax(int a,int b){ return a>b?a:b; } inline int mymin(int a,int b){ return a<b?a:b; } void solve(){ memset(dp,0x3f,sizeof(dp)); int f[20][20]; for(int i=1;i<m;i++){ for(int j=i+1;j<=m;j++){ f[i][j]=0; for(int k=0;k<r;k++){ f[i][j]+=myabs(mp[chose[k]][i]-mp[chose[k]][j]); } } } int col[20]; for(int i=1;i<=m;i++){ col[i]=0; for(int j=1;j<r;j++){ col[i]+=myabs(mp[chose[j]][i]-mp[chose[j-1]][i]); } } for(int i=1;i<=m;i++){ dp[i][1]=col[i]; } for(int i=2;i<=m;i++){ int minc=i<c?i:c; for(int j=2;j<=minc;j++){ for(int k=j-1;k<i;k++){ dp[i][j]=mymin(dp[i][j],dp[k][j-1]+col[i]+f[k][i]); } } } for(int i=c;i<=m;i++){ res=mymin(dp[i][c],res); } } void dfs(int x,int now){ if(x==r){ solve(); return; } if(r-x>n-now+1)return; for(int i=now;i<=n;i++){ chose[x]=i; dfs(x+1,i+1); } } int main(){ scanf("%d%d",&n,&m); scanf("%d%d",&r,&c); for(int i=1;i<=n;i++){ for(int j=1;j<=m;j++){ scanf("%d",mp[i]+j); } } dfs(0,1); printf("%d\n",res); return 0; }
Pascal :
var l:array[0..21]of longint; a:array[0..21,0..21]of longint; n,m,i,j,k,x,y,z,s,ls,r,c:longint; function min(x,y:longint):longint; begin if x<y then exit(x) else exit(y); end; procedure dp; var i,j,k:longint; f,d:array[0..21,0..21]of longint; begin for i:=0 to n do for j:=0 to n do f[i,j]:=maxlongint; fillchar(d,sizeof(d),0); for i:=0 to n do for j:=i+1 to n do begin d[i,j]:=0; if i<>0 then for k:=1 to c do inc(d[i,j],abs(a[j,l[k]]-a[i,l[k]])); for k:=1 to c-1 do inc(d[i,j],abs(a[j,l[k]]-a[j,l[k+1]])); end; f[0,0]:=0; for i:=1 to n do for j:=1 to min(r,i) do begin for k:=i-1 downto 0 do if f[k,j-1]<>maxlongint then begin f[i,j]:=min(f[i,j],f[k,j-1]+d[k,i]); end; end; for i:=r to n do s:=min(s,f[i,r]); end; procedure dg(k:longint); begin if l[0]=c then begin dp; exit; end; if k>m then exit; inc(l[0]); l[l[0]]:=k; dg(k+1); dec(l[0]); dg(k+1); end; begin // assign(input,'submatrix.in'); // reset(input); // assign(output,'submatrix.out'); // rewrite(output); readln(n,m,r,c); for i:=1 to n do for j:=1 to m do read(a[i,j]); s:=maxlongint; dg(1); writeln(s); end.
- 1
信息
- ID
- 1946
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- (无)
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者