AGC033D Complexity
题意
给出一个\(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的更多相关文章
- DP 优化小技巧
收录一些比较冷门的 DP 优化方法. 1. 树上依赖性背包 树上依赖性背包形如在树上选出若干个物品做背包问题,满足这些物品连通.由于 01 背包,多重背包和完全背包均可以在 \(\mathcal{O} ...
- Instant Complexity - POJ1472
Instant Complexity Time Limit: 1000MS Memory Limit: 10000K Description Analyzing the run-time comple ...
- Runtime Complexity of .NET Generic Collection
Runtime Complexity of .NET Generic Collection I had to implement some data structures for my compu ...
- 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 ...
- 空间复杂度是什么?What does ‘Space Complexity’ mean? ------geeksforgeeks 翻译
这一章比较短! 空间复杂度(space complexity)和辅助空间(auxiliary space)经常混用,下面是正确的辅助空间和空间复杂度的定义 辅助空间:算法需要用到的额外或者暂时的存储空 ...
- 三部曲二(基本算法、动态规划、搜索)-1004-Instant Complexity
Instant Complexity Time Limit : 2000/1000ms (Java/Other) Memory Limit : 20000/10000K (Java/Other) ...
- 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 ...
- 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 ...
- 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 ...
随机推荐
- Path.Combine(
// 获取程序的基目录. var dir1 = System.AppDomain.CurrentDomain.BaseDirectory; // 获取模块的完整路径. var dir2 = Syste ...
- spring-boot-plus CORS跨域处理
CORS跨域处理 CORS:Cross-Origin Resource Sharing CORS是一种允许当前域(domain)的资源(比如html/js/web service)被其他域(domai ...
- [Tarjan系列] 无向图e-DCC和v-DCC的缩点
上一篇讲了如何应用Tarjan算法求出e-DCC和v-DCC. 那么这一篇就是e-DCC和v-DCC的应用之一:缩点. 先讲e-DCC的缩点. 我们把每一个e-DCC都看成一个节点,把所有桥边(x,y ...
- el-table el-column selection disable
几个要点: 1.通过 selectable 绑定 2.绑定的方法只能返回0/1 <el-table-column type="selection" width="5 ...
- Unsupported major.minor version 52.0错误和 jdbc odbc
什么是JDBC? JDBC, 全称为Java DataBase Connectivity standard, 它是一个面向对象的应用程序接口(API), 通过它可访问各类关系数据库.JDBC也是jav ...
- Spring切面编程Aspect之@Before和@Around用法
查看dao层使用的sql import java.util.Arrays; import org.apache.commons.lang.ArrayUtils; import org.aspectj. ...
- 启动tomcat提示某个端口被占用
原文参见:https://www.cnblogs.com/liuyanxia/p/6755520.html 解决办法 找出占用1099端口的进程,进入windows命令,查看什么进程占用了1099端口 ...
- css的一些样式
input标签中的一些样式: <input type="text">:表示输入文本 <input type="password">:表示 ...
- JavaScript随机验证码
利用canvas制作一个随机验证码: 1.clearRect:context.clearRect(x,y,width,height);清空给定矩形内的指定像素 2.fillStyle:设置画笔的颜色 ...
- JavaScript 的基本使用
JavaScript 基本语法要求: 1.JS的写法是严格区分大小写的. 2.标识符的起名要求跟java的是一样的,第一个位置可以说字母.下划线.美元符号.其他位置可以字母.下划线.美元符号.数字. ...