本题如果想纯的话。。简直难以名状。
解决方法就是不要只想着,放宽一点复杂度,
想想能不能通过少量的枚举来使更加好写。
这一题,就是枚举行或者列,复杂度,可以接受。
那么行确定了,列的就十分好想了。
#include<iostream> #include<memory.h> #define maxn 20 #define sx 20000000 #define miin(a,b) ((a)<(b)?(a):(b)) #define abss(a,b) ((a)<(b)?((b)-(a)):((a)-(b))) using namespace std; int n,m,a,b,Ans=sx,z[maxn][maxn],s[maxn][maxn],dp[maxn][maxn],hs[maxn],csh[maxn]; void cl(){ for(int i=1;i<=n;i++) memset(s[i],0,sizeof(s[i])); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) dp[i][j]=sx; for(int i=1;i<=n;i++) for(int j=i+1;j<=n;j++) for(int k=1;k<=b;k++) s[i][j]+=abss(z[i][csh[k]],z[j][csh[k]]); memset(hs,0,sizeof(hs)); for(int i=1;i<=n;i++) for(int j=1;j<b;j++) hs[i]+=abss(z[i][csh[j]],z[i][csh[j+1]]); for(int i=1;i<=n;i++)dp[i][1]=hs[i]; for(int i=2;i<=n;i++) for(int k=2;k<=a&&k<=i;k++) for(int j=k-1;j<i;j++) dp[i][k]=miin(dp[i][k],dp[j][k-1]+hs[i]+s[j][i]); /*因为前面为了省复杂度只初始化了一半, 然后这里之前写成s[i][j]导致bug一直 算不进去列和。。*/ for(int i=a;i<=n;i++) Ans=miin(Ans,dp[i][a]); } void dfs(int e,int re){ if(e==b){ cl(); return; } for(int i=re+1;i<=m;i++){ csh[e+1]=i; dfs(e+1,i); } } int main(){ cin>>n>>m>>a>>b; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) {cin>>z[i][j];} dfs(0,0); cout<<Ans; return 0; }