首页 > 其他分享 >P2622 关灯问题II——状压dp

P2622 关灯问题II——状压dp

时间:2022-08-23 21:22:07浏览次数:61  
标签:状态 int 复杂度 状压 II P2622 dp

本题是一道十分好的状压dp练手题

基本思路

初看这道题时其实并没有什么思路,在看到\(n\le 10\)时才想到使用状压dp
有时候搜索时间复杂度很高,也没有方法优化到多项式复杂度,依然可以利用题目中的子问题重叠性得到不错的算法
一个比较显然的事实是:一个按钮不会按多次。所以总的次数不超过\(m\),于是我们写出状态定义:
一个状态为\(n\)位二进制数,其中\(1\)表示打开,\(0\)表示闭合
设\(f(i)\)为达到\(i\)的状态的最小步数
在列出状态转移方程时遇到了麻烦,对于\(0\)的操作,无法得知是从哪个状态转移而来,但是顺推很方便,所以使用向前递推法

代码

#include <bits/stdc++.h>

using namespace std;
const int N=10,M=1e2+5,INF=0x3f3f3f3f;

int n,m,a[M][N];
int f[1<<N]; 

int change(int p,int j) {
	for(int i=0;i<=n-1;i++) {
		if(a[j][i]==-1) p|=1<<i;
		if(a[j][i]==1) if(p>>i&1) p^=1<<i;
	}
	return p;
}

int main() {
	memset(f,0x3f,sizeof(f));
	scanf("%d%d",&n,&m);
	for(int i=1;i<=m;i++)
	  for(int j=0;j<=n-1;j++)
	    scanf("%d",&a[i][j]);
	int bound=(1<<n)-1;
	f[bound]=0;	//初始状态为全1
	for(int i=0;i<=m-1;i++) {
		for(int j=0;j<=bound;j++) {
			if(f[j]==INF) continue;	//小优化
			for(int k=1;k<=m;k++) {
				int l=change(j,k);
				f[l]=min(f[l],1+f[j]);	//向前递推
			}
		}
	}
	if(f[0]==INF) printf("-1");
	else printf("%d",f[0]);
	return 0;
}

标签:状态,int,复杂度,状压,II,P2622,dp
From: https://www.cnblogs.com/wyc06/p/16617848.html

相关文章

  • LeetCode 541. 反转字符串 II
    思路:每次移动2k位,判断是否超过数组,超过则全部反转,没超过则反转到第i+k个classSolution{public:stringreverseStr(strings,intk){for(inti=0;......
  • Yii2 ElasticSearch aggregate (group)
    我想要统计的是country_code出现的次数,通过yii2的ElasticSearch扩展,上面的例子满足我的需要。业务场景:在fecify商城中,使用elasticSearch搜索,进行aggregategrou......
  • C#.NET ORM FreeSql 读取使用 US7ASCII 的 Oracle 数据库中文显示乱码问题
    ......
  • 硬件IIC驱动原理
    1、IIC物理层IIC通信属于同步半双工通信,IIC总线由两根信号线组成。一根是数据线SDA,一根是时钟线SCL,时钟线只能由主机发送给从机,数据线可以双向进行通信,总线上可挂载多个......
  • ASCII
    https://baike.baidu.com/item/ASCII/309296?fr=aladdinASCII(AmericanStandardCodeforInformationInterchange):美国信息交换标准代码是基于拉丁字母的一套电脑编......
  • 220. 存在重复元素 III
     思路难度中等645收藏分享切换为英文接收动态反馈给你一个整数数组 nums 和两个整数 k 和 t 。请你判断是否存在 两个不同下标 i 和 j,使得 abs(nums[i......
  • ASCII表
    https://www.runoob.com/w3cnote/ascii.htmlASCII(发音:,AmericanStandardCodeforInformationInterchange,美国信息交换标准代码)1、可显示字符编号范围是32-126(0x20-0x7......
  • quartus ii 与 modelsim联合仿真方法
    学习Verilog有一段时间了,今天总结下quartusii与modelsim联合仿真方法步骤(开发板芯片用的是Altera的EP4CE10F17C8)1.首先说一下新建工程:选定工程所在的文件夹下一般以......
  • 219. 存在重复元素 II
     思路难度简单506收藏分享切换为英文接收动态反馈给你一个整数数组 nums 和一个整数 k ,判断数组中是否存在两个 不同的索引 i 和 j ,满足 nums[i]==nu......
  • IIS 的网站访问 Bad Request(Invalid Hostname)
    刚做完迁移之后,发现网站打不开了。并且报了上面的错误。解决:    将IP改为*,重启IIS就可以了。......