邻面合并(merging)
邻面合并(merging)
题目描述
给定一个N×MN×M的网格,每个格子上写有0或1。现在用一些长方形覆盖其中写有1的格子,长方形的每条边都要与坐标轴平行。要求:每个写着1的格子都要被覆盖,长方形不可以重叠(重复绘制也多少会增加性能开销),也不能覆盖到任何一个写着0的格子(不然绘制结果就不正确了)。请问最少需要多少长方形?
输入
输入文件第一行两个正整数N,MN,M,表示网格大小为NN行MM列。
接下来的NN行,每行MM个正整数AijAij(保证均为0或1),其中第ii行jj列的正整数表示网格ii行jj列里填的数。
输出
输出文件包含一行一个正整数,表示最少需要的长方形数量。
样例输入
<span style="color:#333333"><span style="color:#333333">4 4
1 1 1 0
1 1 1 1
0 0 1 1
0 0 1 1</span></span>
样例输出
<span style="color:#333333"><span style="color:#333333">3</span></span>
提示
样例解释
一种行的覆盖方案(粗线表示分割线):
数据范围
对于30% 的数据:N,M≤5N,M≤5。
对于100% 的数据:N≤100,M≤8N≤100,M≤8。
来源
solution
状压dp,我想不到
令f[i][S]表示前i行,状态为S
状态为1表示是一个新的开始
比如状态10010
表示划成了2个矩形,开头在1 4
转移时枚举是否能接起来
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define inf 1e9
using namespace std;
int n,m,s[105][10],f[102][1<<9];
int num=0;
bool pd(int k,int S){
for(int i=0;i<m;i++){
int t=(1<<i);
if((S&t)&&s[k][i]==0)return 0;
}
int fl=0;
for(int i=0;i<m;i++){
int t=(1<<i);
if(S&t)fl=1;
if(s[k][i]==1&&!fl)return 0;
if(s[k][i]==0)fl=0;
}
return 1;
}
int cost(int k,int S,int T){
int sum=0;
for(int i=0;i<m;i++){
int t=(1<<i);
if(S&t)sum++;
}
for(int i=0;i<m;i++){
int t=(1<<i);
if((S&t)&&(T&t)){
int ed=i;for(;s[k][ed]&&ed<=m;ed++)if(ed!=i&&(S&(1<<ed)))break;
//cout<<"ed "<<ed<<' '<<i<<endl;
bool fl=0;
for(int j=i+1;j<ed;j++)if(T&(1<<j)){fl=1;break;}
for(int j=i+1;j<ed;j++)if(!s[k-1][j]){fl=1;break;}
if(!fl&&((T&(1<<ed))||!s[k-1][ed]))sum--;
}
}
return sum;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=0;j<m;j++){
scanf("%d",&s[i][j]);
}
}
for(int i=0;i<=n;i++)
for(int j=0;j<(1<<m);j++)f[i][j]=inf;
f[0][0]=0;
for(int i=1;i<=n;i++){
for(int S=0;S<(1<<m);S++){
if(pd(i,S)){
for(int T=0;T<(1<<m);T++){
if(f[i-1][T]!=inf){
//cout<<i<<' '<<S<<' '<<T<<endl;
f[i][S]=min(f[i][S],f[i-1][T]+cost(i,S,T));
//cout<<cost(i,S,T)<<endl;
//system("pause");
}
}
}
}
}
int ans=inf;
for(int S=0;S<(1<<m);S++)ans=min(ans,f[n][S]);
cout<<ans<<endl;
return 0;
}
邻面合并(merging)的更多相关文章
- [CSP-S模拟测试]:邻面合并(状压DP)
题目背景 $NEWorld$作为一个$3D$游戏,对渲染(图形绘制)的效率要求极高.当玩家扩大视野范围时,可见的方块面数量将会迅速增多,以至于大量的顶点处理很快就成为了图形管线中的瓶颈.乔猫想了想,决 ...
- [HNOI2009]梦幻布丁 算法技巧之邻接链
题目描述 N个布丁摆成一行,进行M次操作.每次将某个颜色的布丁全部变成另一种颜色的,然后再询问当前一共有多少段颜色.例如颜色分别为1,2,2,1的四个布丁一共有3段颜色. 输入输出格式 输入格式: 第 ...
- 理解 Git 的基本概念 ( Merging Collaborating Rebasing)
合并 Merging 在分支上开发新功能后,如何把新功能加入到主分支,让其它人得到你的修改呢?你需要使用命令 git merge 或 git pull. 这两个命令的语法如下: git merge [ ...
- NOIP模拟80
学考+OJ改名祭 T1 邻面合并 解题思路 状压 DP ...(于是贪心竟然有 60pts 的高分?? code) 状态设计的就非常妙了,如果状态是 1 就表示是一个分割点也就是一个矩形的右边界. 那 ...
- Noip模拟80 2021.10.18
预计得分:5 实际得分:140?????????????? T1 邻面合并 我考场上没切掉的大水题....(证明我旁边的cty切掉了,并觉得很水) 然而贪心拿了六十,离谱,成功做到上一篇博客说的有勇气 ...
- elasticseach multi-field的实际用途
下面是multi-field的介绍: multi_field 多域类型允许你对同一个值以映射的方式定义成多个基本类型 core_types . 这个非常有用,比如,如果你定义一个 string 类型的 ...
- TortoiseSVN中图标的含义
今天在使用svn时发现有好多不认识了,所以查了下svn帮助手册.借此总结了下 svn 中图标的含义 一个新检出的工作复本使用绿色的勾做重载.表示Subversion状态 正常. 在开始编辑一个文件后, ...
- C语言动态内存管理
1-概述 动态存储管理的基本问题是:系统如何按请求分配内存,如何回收内存再利用.提出请求的用户可能是系统的一个作业,也可能是程序中的一个变量. 空闲块 未曾分配的地址连续的内存区称为“空闲块”. 占用 ...
- Git让你从入门到精通,看这一篇就够了!
简介 Git 是什么? Git 是一个开源的分布式版本控制系统. 什么是版本控制? 版本控制是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统. 什么是分布式版本控制系统? 介绍分布 ...
随机推荐
- 解决centos7 nslookup:command not found
解析域名www.google.com时,报错,命令找不到,是因为新安装的centos7,没有安装bind-utils,安装后就可以运行nslookup了
- Luogu [P1248] 加工生产调度
题目链接 这个题可以贪心 我们首先想:对于所有产品,我们大致可以将其分为三类: ①.在A车间的时间要比B车间长. ②.两者一样. ③.在B车间的时间要比A车间长. 对于这三大类,怎么安排顺序? 可以看 ...
- java基础编程——重建二叉树
题目描述 输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字.例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7, ...
- 后台调用前台js
WEB后台代码调用前台JS(两种方式). 1 这种方式只能调用简单的JS代码.不能调用自定义的函数. string jss = "<script language='javascr ...
- WordPress免费清新响应式博客/杂志/图片三合一主题Nana
WordPress免费清新响应式博客/杂志/图片三合一主题Nana 一.主题安装须知 1.本主题必须安装文章点击统计插件:WP-PostViews,可以直接在后台插件→安装插件中直接搜索安装官方最新版 ...
- 深入理解React虚拟DOM
一.什么是虚拟DOM 虚拟DOM可以看做一棵模拟了DOM树的JavaScript对象树.比如: var element = { element: 'ul', props: { id:"uli ...
- 打开POST传参的弹出窗口
//穿件 function openPostPopWindow(url,param,target){ var $form = $("<form></form>&quo ...
- JAVA连接数据库,并写入到txt文件
package Hello; import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;impor ...
- 安装ANSYS19.0的正确方法(附下载)
安装ANSYS19.0的正确方法 卸载干净旧版本ANSYS 安装或重新安装之前必须先卸载干净,安装过旧版本ANSYS的也要确保卸载干净.电脑环境准备参考以下内容 ANSYS 卸载后重装需要注意的问题_ ...
- 华东交通大学2018年ACM“双基”程序设计竞赛 K
MIKU酱是个玩游戏氪金的人,游戏公司给她制定了新的规则,如果想从关卡i到关卡j,你需要交一些钱就可以了,但同时,MIKU酱的爸爸zjw很爱她,所以她可以每过一关就向她爸要一次钱,但她爸每次给他的钱是 ...