zoukankan      html  css  js  c++  java
  • 悬线法 洛谷 P1387 最大正方形 P1681 最大正方形II P1736 创意吃鱼法

    P1387 最大正方形

    题意:一个01矩阵,求最大全1子矩阵边长

    核心dp方程:

        if(!area[i][j])continue;
    	f[i][j]=min(min(f[i][j-1],f[i-1][j]),f[i-1][j-1])+1;
    	ans=max(ans,f[i][j]);
    

    P1681 最大正方形II

    题意:求最大01交替的子矩阵边长

    可以开两个状态求解

    	scanf("%d",&area[i][j]);
    	if(area[i][j])
    		f[i][j][1]=min(min(f[i][j-1][0],f[i-1][j][0]),f[i-1][j-1][1])+1,ans=max(ans,f[i][j][1]);
    	if(!area[i][j])
    		f[i][j][0]=min(min(f[i][j-1][1],f[i-1][j][1]),f[i-1][j-1][0])+1,ans=max(ans,f[i][j][0]);
    

    P1736 创意吃鱼法

    题意:求最大对角线全1,其他全0的子矩阵边长

    注意分斜率为1和斜率为-1两种情况

    开个预处理

    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=m;j++){
    			if(area[i][j])lef[i][j]=0;
    			else lef[i][j]=lef[i][j-1]+1;
    		}
    	}
    	for(int i=1;i<=n;i++){
    		for(int j=m;j>=1;j--){
    			if(area[i][j])rig[i][j]=0;
    			else rig[i][j]=rig[i][j+1]+1;
    		}
    	}
    	for(int j=1;j<=m;j++){
    		for(int i=1;i<=n;i++){
    			if(area[i][j])up[i][j]=0;
    			else up[i][j]=up[i-1][j]+1;
    		}
    	}
    
    

    之后的转移跟最大正方形几乎一样

    	for(int i=1;i<=n;i++){
    		for(int j=1;j<=m;j++){
    			if(!area[i][j])continue;
    			f[i][j]=min(f[i-1][j-1],min(lef[i][j-1],up[i-1][j]))+1;
    			ans=max(f[i][j],ans);
    		}
    	}
    	for(int i=1;i<=n;i++){
    		for(int j=m;j>=1;j--){
    			if(!area[i][j])continue;
    			f[i][j]=min(f[i-1][j+1],min(rig[i][j+1],up[i-1][j]))+1;
    			ans=max(f[i][j],ans);
    		}
    	}
    

    反而比最大正方形II好想

  • 相关阅读:
    mysql 查询结果中增加序号
    mycat配置文件备份
    解决Python安装模块出错 ImportError: No module named setuptools
    sed 详解【转】
    CentOS下配置SFTP操作日志
    解决redis aof文件过大的问题
    mysql主从复制搭建中几种log和pos详解
    Linux下使用命令行配置IPMI
    Zabbix笔记
    zabbix_agentd.conf配置文件详解
  • 原文地址:https://www.cnblogs.com/Y15BeTa/p/11832124.html
Copyright © 2011-2022 走看看