区间dp(二维)——cf1199F

复杂度是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];
}

 

posted on 2019-10-09 19:25  zsben  阅读(387)  评论(0编辑  收藏  举报

导航