状压dp·

定义:

状压 dp 又叫集合动态规划。是以结合信息为状态的特殊的动态规划的问题。主要有传统集合动态规划基于连通性状态压缩的动态规划

状压dp

设计一个整型可变参数status,利用status的位信息,来表示:

某个样本是否还能使用,然后利用这个信息进行尝试

写出尝试的递归的函数 -> 记忆化搜索 -> 严格位置的动态规划 -> 空间压缩等优化

如果有k个样本,那么表示这些样本的状态,数量为2^k

样本每增加一个,状态的数量是指数级增长的,所以状压dp能解决的问题往往数据量不大

一般样本数量在20个以内

题目一

# include <stdio.h>
# include <string.h>

//如果1~7范围的数字都能选,那么statue的状态为:
//1 1 1 1 1 1 1 1
//7 6 5 4 3 2 1 0
//0位弃而不用
//如果1~7范围的数字,4、2已经选了不能再选,那么statue的状态:
//1 1 1 0 1 0 1 1 
//7 6 5 4 3 2 1 0
//0位弃而不用
//f的含义:
//数字范围 1 ~ n,当前的先手,面对statue给定的数字状态
//在累加和还剩rest的情况下
//返回先手能不能赢,能赢返回true,不能赢返回false 

bool cmp(int n, int m, int* dp, int * statue)
{
	if (m <= 0)
		return false;
	if (dp[statue] != 0)
	{
		if (dp[statue] == 1)
			return true;
		else
			return false;
	}
	bool ans = false;
	for (int i=1; i<n; ++i)
	{
		//考察所有数字,但是不能选择之前选了的数字 
		if ((statue & (1<<i)) != 0 && cmp(n, m-i, dp, statue-(1<<i)) == true)
		{
			ans = true;
			break;
		}
	}
	if (ans == true)
		dp[statue] = 1;
	else
		dp[statue] = -1;
	return ans;
}

int main()
{
	int n;
	int m;
	scanf("%d %d", &n, &m);
	int dp[1<<(n+1)];
	int statue[1<<(n+1)-1]; //用二进制数表示该该数字是否还能使用,然后利用这个信息进行尝试 
	//dp[statue] == 0 代表没算过
	//dp[statue] == 1 算过,答案是true
	//dp[statue] == -1 算过,答案是false 
	memset(statue, 0, sizeof(statue));
} 

题目二

我们用下标处理matchsticks[]数组中的火柴棒长度

设计一个整型可变参数status,利用status的位信息,来表示:

某个下标对应的火柴是否还能使用,然后利用这个信息进行尝试

代码:

# include <stdio.h>
// limit:每条边规定的长度
// statue: 表示哪些数字还可以选
// cur:当前要解决的这条边已经形成的长度
// rest:一共还有几条边没有解决
//返回:能否用光所有的火柴去解决剩下的所有边
//statue是决定cur和rest的,关键可变参数只有statue 
bool cmp(int n, int* s, int limit, int cur, int rest, int* dp, int statue)
{
	if (rest == 0)
	{
		if (statue == 0)
			return true;
		else
			return false;
	} 
	if (dp[statue] != 0)
	{
		if (dp[statue] == 1)
			return true;
		else
			return false;
	}
	bool ans = false;
	for (int i=0; i<n; ++i)
	{
		if ((statue & (1<<i)) == 1 && cur+s[i] <= limit)
		{
			if (cur + s[i] == limit)
				ans = cmp(n, s, limit, 0, rest-1, dp, statue-(1<<i));
			else
				ans = cmp(n, s, limit, cur+s[i], rest, dp, statue-(1<<i));
			if (ans == true)
				break;	
		}
	}
	if (ans == true)
		dp[statue] = 1;
	else
		dp[statue] = -1;
	return ans;
}

int main()
{
	int n;
	scanf("%d", &n);
	int s[n];
	int sum = 0;
	for (int i=0; i<n; ++i)
	{
		scanf("%d", &s[i]);
		sum = sum + s[i];
	}
	int dp[1<<(n+1)];
	int statue = 1<<(n+1)-1;
	sum = sum/4;
	int ans = cmp(n, s, sum, 0, dp, statue);
}

TSP问题

设计一个整型可变参数status,利用status的位信息,来表示:

某个下标对应的村庄是否到达过,然后利用这个信息进行尝试,取min

# include <stdio.h>
int n;
 //s表示 statue(用于表示村子是否走过,如果走过则为1) 
 //x表示 目前在哪个村 
int cmp(int s, int x)
{
	if (s == (1<<n)-1)
		//如果村子都走完了 
		return gragh[x][0];
		
	if (dp[s][x]!=-1)
		return dp[s][x];
	int ans = 99999;
	for (int j=1; j<n; ++j)
	{
		//1…n-1这些村子中,查看是否有下一个落脚点 
		if ((s & (1<<j)) == 0) //当第 j 位(位信息)的 s 为0时,表示没有到达过 
			ans = min(ans, graph[x][j] + cmp(s|(1<<j), j));
	}
	dp[s][x] = ans;
	return ans;
}

int main()
{
	scanf("%d", &n);
	int dp[n][n];
	memset(dp, -1, sizeof(dp));
	int gragh[n][n];
	for (int i=0; i<n; ++i)
		for (int j=0; j<n; ++j)
			scanf("%d", &gragh[i][j]);
	int ans = cmp(1, 0)//1的二进制为000001,其中的1位于第0位,表示第0位(也就是起点)已经到达 
	
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/466560.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

特约撰稿 | 巴比馒头CIO周伟:2024的趋势判断与CI0的创变提升

我们将聚焦产品研发和生产运营管控&#xff0c;将市场需求与产品研发、生产过程数字化运营管控相结合&#xff0c;并持续优化。 文&#xff5c;巴比馒头CIO 周伟 排版&#xff5c;陶旖 审核&#xff5c;马向阳 全文共 3500 字&#xff0c;建议预留 15 分钟不被打扰的时间&a…

Greetings

Problem - 1915F - Codeforces 题意 给一些(l,r)找到所有能够包含(l,r)的数目 引入 也就是找逆序对个数 要用到归并排序中的思想&#xff1a; //https://www.luogu.com.cn/problem/P1216 #include<iostream> #include<cstdio> #include<stack> #include…

centos7修改ssh登录错误限制和端口修改

前几天登录服务器的时候发现有错误登录信息15w多条&#xff0c;该服务器映射了外网&#xff0c;估计是被爆破了。为了防止再有人进行爆破&#xff0c;修改一下ssh的限制登录顺便把默认端口改掉 编辑ssh配置文件 vim /etc/ssh/sshd_config去掉注释 按需修改次数 MaxAuthTries 6…

阿里云数据库RDS PostgreSQL价格227元一年,2核4GB(通用型)

阿里云数据库优惠价格99元1年&#xff0c;配置为云数据库RDS MySQL版基础系列经济版&#xff0c;2核2GB、50GB通用云盘&#xff0c;新老用户均可购买&#xff0c;续费99元1年&#xff0c;云数据库MySQL 2核4GB 100GB 通用云盘优惠价格227元1年&#xff0c;其他云数据库版本如SQ…

ssh连接报错:REMOTE HOST IDENTIFICATION HAS CHANGED问题解决

ssh之前连接没有问题&#xff0c;远程主机发生修改后&#xff0c;重新连接&#xff0c;出现如下报错&#xff1a;WARNING:REMOTE HOST IDENTIFICATION HAS CHANGED! 问题原因&#xff1a; ssh-keygen是用于为SSH创建新的身份验证密钥对的工具。此类密钥对用于自动登录&#xf…

vue methods 函数为啥不能是箭头函数

1、首先&#xff0c;因为methods里面的方法中的this是可以拿到data中定义的属性&#xff0c;所以它肯定不是window,但是methods 中 箭头函数里面的this指向window所以methods里面的方法不能定义箭头函数。 下面用代码说明为啥 methods中箭头函数中的this指向window <div i…

上位机图像处理和嵌入式模块部署(qmacvisual畸变矫正)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 大部分同学在开始做计算机图像的时候&#xff0c;是没有意识到畸变矫正这个问题的。当然不仅仅是畸变矫正&#xff0c;很多同学还会忽略光源的问题…

深入了解 Spring boot的事务管理机制:掌握 Spring 事务的几种传播行为、隔离级别和回滚机制,理解 AOP 在事务管理中的应用

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &a…

深圳女游客山顶拍照不慎跌落,幸得及时救助无大碍。

深圳排牙山近日发生了一起惊险的意外事件。一名女游客在龟仙石打卡拍照时&#xff0c;因手滑不慎从石头上跌落&#xff0c;幸运的是&#xff0c;周围的游客迅速反应&#xff0c;合力接住了她&#xff0c;避免了更严重的后果。 据了解&#xff0c;这位女游客在攀爬龟仙石时&…

Dagger2相关知识

目录 一、Dagger简介1.1 什么是Dagger?1.2 Dagger用来干什么&#xff1f;1.3 使用Dagger2注入对象1.4 Dagger注解 二、Dagger2使用2.1 非单例2.2 局部单例2.3 全局单例 三、参考链接 一、Dagger简介 1.1 什么是Dagger? Dagger 2 是一个由 Google 开发的依赖注入框架&#x…

HTML + CSS 核心知识点- 定位

简述&#xff1a; 补充固定定位也会脱离文档流、不会占据原先位置 1、什么是文档流 文档流是指HTML文档中元素排列的规律和顺序。在网页中&#xff0c;元素按照其在HTML文档中出现的顺序依次排列&#xff0c;这种排列方式被称为文档流。文档流决定了元素在页面上的位置和互相之…

【图论】树链剖分

本篇博客参考&#xff1a; 【洛谷日报#17】树链剖分详解Oi Wiki 树链剖分 文章目录 基本概念代码实现常见应用路径维护&#xff1a;求树上两点路径权值和路径维护&#xff1a;改变两点最短路径上的所有点的权值求最近公共祖先 基本概念 首先&#xff0c;树链剖分是什么呢&…

centos7.9的GUI桌面样式不符合默认熟悉的操作习惯

一、问题描述&#xff1a; 原因&#xff1a;桌面样式选错了。 二、解决&#xff1a; 1.先登进去LogOut。 2.点击设置的工具图标中的GNOME Classic即可恢复成默认操作习惯的桌面样式。 3.恢复到默认熟悉的操作界面

基于有限状态机开发健壮的Nodejs/TCP客户端

有限状态机是一种数学计算模型&#xff0c;它描述了在任何给定时间只能处于一种状态的系统的行为。形式上&#xff0c;有限状态机有五个部分&#xff1a; 初始状态值 (initial state)有限的一组状态 (states)有限的一组事件 (events)由事件驱动的一组状态转移关系 (transition…

浏览器如何查看http请求的报文?

HTTP协议用于从WWW服务器传输超文本到本地浏览器的传送协议。 它可以使浏览器更加高效&#xff0c;使网络传输减少。 它不仅保证计算机正确快速地传输超文本文档&#xff0c;还确定传输文档中的哪一部分&#xff0c;以及哪部分内容首先显示 (如文本先于图形)等。所以在node.js里…

viple拓展题

数数问题 题目&#xff1a;使用viple来实现程序&#xff0c;使得运行结果能将数字逐个数出即可 思路&#xff1a;首先&#xff0c;数数字&#xff0c;不知道用户具体要求数到多少结束&#xff0c;所以&#xff0c;可以采用简单的对话活动来实现与用户的交互。其次&#xff0c;…

Linux系统安装1Panel管理面板并实现无公网IP远程管理本地服务器

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、…

string类型的使用以及编码方式

Redis 中所有的键的类型都是字符串类型&#xff0c;⼀个字符串的最⼤值不能超过 512 MB。 由于 Redis 内部存储字符串完全是按照⼆进制流的形式保存的&#xff0c;所以 Redis 是不处理字符集编码问题的&#xff0c;客⼾端传⼊的命令中使⽤的是什么字符集编码&#xff0c;就存储…

放在你后口袋里的七种基本质量工具

以下是我反复看到的七种质量改进工具。这些质量工具中的大多数已经存在了一段时间&#xff0c;但这肯定不会降低它们的价值&#xff01; 这些工具最大的优点是使用非常简单&#xff0c;并且可以在中快速使用Minitab统计软件或者从事&#xff0c;但你当然可以使用其他方法&…

【已解决】MySQL:常用的除法运算+精度处理+除数为0处理

目录 问题现象&#xff1a; 问题分析&#xff1a; 拓展&#xff1a; 1、除法运算&#xff1a; 拓展&#xff1a;MySQL中常用的几种除法运算 1、取整除法 2、浮点数除法 3、取余除法 4、向上取整除法 5、向下取整除法 2、运算结果的精度处理 1.1、浮点数 1.2、总位数 1.3、…