1 条题解

  • 0
    @ 2025-4-7 21:38:07

    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
    上传者