题意

给出一个\(n*m\)的\(0,1\)矩阵,若一个矩阵中的所有元素都相同,则这个矩阵的代价为\(0\),如果不是则选择一种将它分成两个子矩阵的方案,代价为所有方案中(两个子矩阵的代价的较大值+\(1\))的最小值。

\(n,m \leq 185\)

传送门

思路

\(dp[ i ][ j ][ k ][ l ]\) 表示左上角是 $( i , j ) $ 、右下角是 $ ( k , l ) $的矩阵的最小代价,四维扛不住。

因为如果每次从中间分,\(log(n)+log(m)\)次就变成\(1*1\)的格子,代价是 \(0\),所以答案最多是\(log(n)+log(m)\)。

因此可以将值放进状态中,$dp[ i ][ j1 ][ j2 ][ k ] $表示左上角是 \(( i , j1 )\)、右上角是 $ ( i , j2 ) $ 、用$ k $的代价,往下最长能延伸到哪行。

转移的时候考虑横着切与竖着切。令$ d = dp[ i ][ j1 ][ j2 ][ k ]$ :

  • 横着切:$ d = dp \space [ dp[ i ][ j1 ][ j2 ][ k-1 ] +1] \space [ j1 ][ j2 ][ k-1 ] $;

  • 竖着切:\([ j1 , j3 ] 和 [ j3+1 , j2 ]\) 就是分出的两部分;

    \(dp[ i ][ j1 ][ j3 ][ k-1 ]\) 和 \(dp[ i ][ j3+1 ][ j2 ][ k-1 ]\)的最小值是答案,\(d\)为最小值中的最大值。至此我们得出了\(O(m)\)的暴力转移。

    因为\(dp\)值明显随矩阵增大而减小,所以可二分\(j3\)。考虑二分找出最大的\(min( dp[ i ][ j1 ][ j3 ][ k-1 ] , dp[ i ][ j3+1 ][ j2 ][ k-1 ] )\)。(左比右大往左,反过来,总之越接近越好)

初始化出所有\(k=0\)的情况即可

#include <bits/stdc++.h>
const int N=190;
using std::max;
using std::min;
int n,m,a[N][N],sum[N][N],dp[N][N][N][15];
char c[N][N];
int main(){
scanf("%d%d",&n,&m);
for (int i=1;i<=n;i++) scanf("%s",c[i]+1);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++){
if (c[i][j]=='.') a[i][j]=1;
else a[i][j]=0;
sum[i][j]=sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1]+a[i][j];
}
for (int i=1;i<=n;i++)
for (int j=1;j<=m;j++)
for (int k=j;k<=m;k++){
int l=i,r=n,ans=i-1;
while (l<=r){
int mid=(l+r)>>1;
int s=sum[mid][k]-sum[mid][j-1]-sum[i-1][k]+sum[i-1][j-1];
if (s==0 || s==(mid-i+1)*(k-j+1))
ans=mid,l=mid+1;
else r=mid-1;
}
dp[i][j][k][0]=ans;
}
int k=1;
for (k=1;dp[1][1][m][k-1]<n;k++)
for (int h=1;h<=m;h++)
for (int i=1;i<=n;i++)
for (int j1=1,j2=j1+h-1;j2<=m;j1++,j2++){
if (dp[i][j1][j2][k-1]==n){
dp[i][j1][j2][k]=n;
continue;
}
dp[i][j1][j2][k]=dp[dp[i][j1][j2][k-1]+1][j1][j2][k-1];//横
if(dp[i][j1][j2][k]==n) continue;
int l=j1,r=j2-1,ans=0;//竖
while (l<=r){
int mid=(l+r)>>1;
int x=dp[i][j1][mid][k-1],y=dp[i][mid+1][j2][k-1];
ans=max(ans,min(x,y));
if (x<y) r=mid-1;
else l=mid+1;
} dp[i][j1][j2][k]=max(dp[i][j1][j2][k],ans);
}
printf("%d\n",k-1);
}

AGC033D Complexity的更多相关文章

  1. DP 优化小技巧

    收录一些比较冷门的 DP 优化方法. 1. 树上依赖性背包 树上依赖性背包形如在树上选出若干个物品做背包问题,满足这些物品连通.由于 01 背包,多重背包和完全背包均可以在 \(\mathcal{O} ...

  2. Instant Complexity - POJ1472

    Instant Complexity Time Limit: 1000MS Memory Limit: 10000K Description Analyzing the run-time comple ...

  3. Runtime Complexity of .NET Generic Collection

    Runtime Complexity of .NET Generic Collection   I had to implement some data structures for my compu ...

  4. Examples of complexity pattern

    O(1):constant - the operation doesn't depend on the size of its input, e.g. adding a node to the tai ...

  5. 空间复杂度是什么?What does ‘Space Complexity’ mean? ------geeksforgeeks 翻译

    这一章比较短! 空间复杂度(space complexity)和辅助空间(auxiliary space)经常混用,下面是正确的辅助空间和空间复杂度的定义 辅助空间:算法需要用到的额外或者暂时的存储空 ...

  6. 三部曲二(基本算法、动态规划、搜索)-1004-Instant Complexity

    Instant Complexity Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 20000/10000K (Java/Other) ...

  7. THE ARCHITECTURE OF COMPLEXITY HERBERT A. SIMON* Professor of Administration, Carnegie Institute of Technology (Read April 26, 1962)

    THE ARCHITECTURE OF COMPLEXITY HERBERT A. SIMON* Professor of Administration, Carnegie Institute of ...

  8. CLRS:master theory in complexity of algorithm

    T(n)=aT(n/b)+f(n); where we can interpret n/b to mean either floor(b/n) or ceil(b/n), Then T (n) has ...

  9. The Brain vs Deep Learning Part I: Computational Complexity — Or Why the Singularity Is Nowhere Near

    The Brain vs Deep Learning Part I: Computational Complexity — Or Why the Singularity Is Nowhere Near ...

随机推荐

  1. Path.Combine(

    // 获取程序的基目录. var dir1 = System.AppDomain.CurrentDomain.BaseDirectory; // 获取模块的完整路径. var dir2 = Syste ...

  2. spring-boot-plus CORS跨域处理

    CORS跨域处理 CORS:Cross-Origin Resource Sharing CORS是一种允许当前域(domain)的资源(比如html/js/web service)被其他域(domai ...

  3. [Tarjan系列] 无向图e-DCC和v-DCC的缩点

    上一篇讲了如何应用Tarjan算法求出e-DCC和v-DCC. 那么这一篇就是e-DCC和v-DCC的应用之一:缩点. 先讲e-DCC的缩点. 我们把每一个e-DCC都看成一个节点,把所有桥边(x,y ...

  4. el-table el-column selection disable

    几个要点: 1.通过 selectable 绑定 2.绑定的方法只能返回0/1 <el-table-column type="selection" width="5 ...

  5. Unsupported major.minor version 52.0错误和 jdbc odbc

    什么是JDBC? JDBC, 全称为Java DataBase Connectivity standard, 它是一个面向对象的应用程序接口(API), 通过它可访问各类关系数据库.JDBC也是jav ...

  6. Spring切面编程Aspect之@Before和@Around用法

    查看dao层使用的sql import java.util.Arrays; import org.apache.commons.lang.ArrayUtils; import org.aspectj. ...

  7. 启动tomcat提示某个端口被占用

    原文参见:https://www.cnblogs.com/liuyanxia/p/6755520.html 解决办法 找出占用1099端口的进程,进入windows命令,查看什么进程占用了1099端口 ...

  8. css的一些样式

    input标签中的一些样式: <input type="text">:表示输入文本 <input type="password">:表示 ...

  9. JavaScript随机验证码

    利用canvas制作一个随机验证码: 1.clearRect:context.clearRect(x,y,width,height);清空给定矩形内的指定像素 2.fillStyle:设置画笔的颜色 ...

  10. JavaScript 的基本使用

    JavaScript 基本语法要求: 1.JS的写法是严格区分大小写的. 2.标识符的起名要求跟java的是一样的,第一个位置可以说字母.下划线.美元符号.其他位置可以字母.下划线.美元符号.数字. ...