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. /************************************************************** Problem: 2333 User: admin Language: Pascal Result: Wrong Answer ****************************************************************/