复杂度是O(N^5),枚举所有小矩形,转移时再按每列,每行进行转移
#include<bits/stdc++.h> using namespace std; #define N 55 int n,dp[N][N][N][N]; char mp[N][N]; int main(){ cin>>n; for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) cin>>mp[i][j]; memset(dp,0x3f,sizeof dp); for(int i=1;i<=n;i++) for(int j=1;j<=n;j++) if(mp[i][j]=='.') dp[i][j][i][j]=0; else dp[i][j][i][j]=1; for(int lena=1;lena<=n;lena++) for(int lenb=1;lenb<=n;lenb++) for(int i=1;i+lena-1<=n;i++) for(int j=1;j+lenb-1<=n;j++){ int k=i+lena-1,l=j+lenb-1; if(i==k && j==l) continue; dp[i][j][k][l]=max(abs(i-k)+1,abs(j-l)+1);//初始值 for(int t=i;t<=k-1;t++)//枚举中间行 dp[i][j][k][l]=min(dp[i][j][k][l],dp[i][j][t][l]+dp[t+1][j][k][l]); for(int t=j;t<=l-1;t++)//枚举中间列 dp[i][j][k][l]=min(dp[i][j][k][l],dp[i][j][k][t]+dp[i][t+1][k][l]); } /* for(int i=3;i<=n;i++){ for(int j=3;j<=n;j++) cout<<dp[3][3][i][j]<<" "; puts(""); } */ cout<<dp[1][1][n][n]; }