其实这个题挺裸的dp
主要是你需要dfs+dp 不然直接dp肯定是不行的
而且写完代码一定检查一下。。变量名最好要用易懂的,,不然容易错 用了3个错误的变量名竟然有90分
码:
#include<iostream> #include<cstdio> using namespace std; #include<cmath> #define inf 1e9+1 int daan=inf; int y,x,n,m,costm[17],costn[17][17],f[17][17],a[17][17],hang[17],i,j; void dfs(int ceng,int shang) {int i,j,k,lin; if(ceng==x+1) { for(i=1;i<=m;i++) {costm[i]=0; for(j=2;j<=x;j++) { costm[i]+=fabs(a[hang[j]][i]-a[hang[j-1]][i]); } } for(i=1;i<=m;i++) for(k=i+1;k<=m;k++) { costn[i][k]=costn[k][i]=0; for(j=1;j<=x;j++) { costn[k][i]+=fabs(a[hang[j]][i]-a[hang[j]][k]); costn[i][k]=costn[k][i]; } } for(i=1;i<=m;i++) for(k=1;k<=y;k++) f[k][i]=inf; for(i=1;i<=m;i++) f[1][i]=costm[i]; for(k=2;k<=y;k++) { for(i=k;i<=m;i++) { for(j=k-1;j<i;j++) { f[k][i]=min(f[k][i],f[k-1][j]+costn[i][j]+costm[i]); } } } int ans=inf; for(i=y;i<=m;i++) { ans=min(f[y][i],ans); } daan=min(daan,ans); return; } for( i=shang+1;i<=n;i++) { hang[ceng]=i; dfs(ceng+1,i); } } int main() { scanf("%d%d%d%d",&n,&m,&x,&y); for(i=1;i<=n;i++) for(j=1;j<=m;j++) scanf("%d",&a[i][j]); dfs(1,0); printf("%d",daan); }