1 条题解

  • 0
    @ 2025-10-10 20:13:36

    C++ :

    #include <cstdio>
    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <cstring>
    using namespace std;
    #define min(a,b) (a<b?a:b)
    int n,m,r,c;
    int a[18][18],f[18][18];
    //f[i][j]表示已经选了i列,最后一列是j的最小分数
    int w[18],v[18][18],rec[18];
    //每列之间的分数w,两列之间的分数v
    int ans=1<<30;
    void dps()
    {
        memset(f,127,sizeof(f));
        memset(w,0,sizeof(w));
        memset(v,0,sizeof(v)); 
        //f[i][j]=min(f[i-1][k]+w[j]+v[j][k],f[i][j])
        int i,j,k;
        for (i=1; i<=m; ++i)
        {
            for (j=1; j<r; ++j)
            {
                w[i]=w[i]+abs(a[rec[j]][i]-a[rec[j+1]][i]);
            }
            //cout<<w[i]<<"w"<<endl;
        }
        for (i=1; i<=m; ++i) 
        {
            for (j=i+1; j<=m; ++j) 
            {
                for (k=1; k<=r; ++k)
                {
                    v[i][j]=v[i][j]+abs(a[rec[k]][i]-a[rec[k]][j]);
                }
                //cout<<v[i][j]<<"v";
            }
        }
        f[0][0]=0; //(0,0)=0
        for (i=1; i<=c; ++i) //选了I列
        {
            for (j=i; j<=m; ++j) //最后一列为J
            {
                for (k=0; k<j; ++k) //枚举上一次选的列数
                {
                    f[i][j]=min(f[i-1][k]+w[j]+v[k][j],f[i][j]);
                } 
            } 
        } 
        for (i=c; i<=m; ++i)
        {
            ans=min(ans,f[c][i]);
        }
    }
    void dfs(int x,int y)
    {
        if(y>r)
        {
            dps();
            return;
        }
        if (x>n) return;
        dfs(x+1,y); //这一列不选 ,Next one
        rec[y]=x; //记录x的值在rec【y】中体现 
        dfs(x+1,y+1); //选! 
    }
    int main()
    {
        int i,j;
        cin>>n>>m>>r>>c;
        for (i=1; i<=n; ++i)
        {
            for (j=1; j<=m; ++j)
            {
                scanf("%d",&a[i][j]);
            }
        }
        dfs(1,1);
        cout<<ans;    
    }
    
    • 1

    信息

    ID
    1103
    时间
    1000ms
    内存
    512MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者