首页 > 其他分享 >动态规划四

动态规划四

时间:2023-08-03 14:55:15浏览次数:34  
标签:状态 cnt 动态 int namespace include 规划 define

复健\(day4\)

动态规划(四)状压\(DP\)

题目中的要求与位运算相关的表示:

\(1.\)同一行不能有相邻的\(1\):\(if(!(i\&(i>>1)))\)

\(2.\)某一行不能与上一行的正上方左上方和右上方同时有\(1\):\(!(a\&b)\)且\(!(a\&b>>1)\)且\(!(a\&b<<1)\)

\(3.\)统计\(i\)包含的\(1\)的个数:\(for(int j=0;j<n;j++) num[i]+=(i>>j\&1);\)

\(1.\)小国王

\(f[i][j][k]\)表示前\(i\)行已经放了\(j\)个国王,状态为\(k\)的方案数,用\(c[k]\)表示状态为\(k\)时放入的国王数

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define maxn 15
using namespace std;

int n,k;
int cnt;
int s[1<<maxn];//存储一行的合法状态 
int num[1<<maxn];
long long f[maxn][maxn*maxn][1<<maxn];

int main()
{
	cin>>n>>k;
	for(int i=0;i<(1<<n);i++)
	{
		if(!(i&i>>1))
		{
			s[cnt++]=i;
			for(int j=0;j<n;j++) num[i]+=(i>>j&1);//统计i包含的1的个数
		}
	}
	f[0][0][0]=1;//不放国王也是一种方案
	for(int i=1;i<=n+1;i++)
	{
		for(int j=0;j<=k;j++)
		{
			for(int a=0;a<cnt;a++)
			{
				for(int b=0;b<cnt;b++)
				{
					int c=num[s[a]];
					if((j>=c)&&!(s[a]&s[b])&&!(s[a]&s[b]>>1)&&!(s[a]&s[b]<<1))
						f[i][j][a]+=f[i-1][j-c][b];
				}
			}
		}
	}
	printf("%lld\n",f[n+1][k][0]);//第n+1行什么都不放
}

\(2.\)炮兵阵地

https://www.luogu.com.cn/problem/P2704

还是先做预处理,处理出一行中合法的状态(也就是再相邻的三个格子里不能有两个1)\(!(i\&i>>1)\)且\(!(i\&i>>2)\)

行间合法为\(!(a\&b)\)且\(!(a\&c)\)且\(!(b\&c)\)

由于要使第\(i\)行在规定位置上放置,则\((s[a]\&g[i])==s[a]\)

\(f[i][a][b]\)表示第\(i\)行状态为\(a\),第\(i-1\)行状态为\(b\)的最大数量

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define maxn 10
using namespace std;

int s[1<<maxn];
int g[110];
int cnt;
int num[1<<maxn];
int f[110][1<<maxn][1<<maxn];

int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<m;j++)
		{
			char c;
			cin>>c;
			if(c=='P') g[i]+=1<<(m-j-1);
		}
	}
	for(int i=0;i<(1<<m);i++)
	{
		if(!(i&i>>2)&&!(i&i>>1))
		{
			s[++cnt]=i;
			for(int j=0;j<m;j++) num[i]+=(i>>j&1);
		}
	}
	for(int i=1;i<=n+2;i++)//多算两行时为了最终的最大数量方便表示
	{
		for(int a=1;a<=cnt;a++)
		{
			for(int b=1;b<=cnt;b++)
			{
				for(int c=1;c<=cnt;c++)
				{
					if(!(s[a]&s[b])&&!(s[a]&s[c])&&!(s[b]&s[c])&&(s[a]&g[i])==s[a]&&(s[b]&g[i-1])==s[b])
					{
						f[i][a][b]=max(f[i][a][b],f[i-1][b][c]+num[s[a]]);
					}
				}
			}
		}
	}
	printf("%d\n",f[n+2][1][1]);
}

\(3.\)玉米田

https://www.acwing.com/problem/content/329/

#include<iostream>
#include<cstdio>
#define maxn 15
using namespace std;

const int mod=1e8;

int s[1<<maxn];
int cnt;
int g[maxn];
int f[maxn][1<<maxn];

int main()
{
	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<m;j++)
		{
			int c;
			cin>>c;
			g[i]+=(c<<(m-j-1));
		}
	}
	for(int i=0;i<(1<<m);i++)
	{
		if(!(i&i>>1)) s[++cnt]=i;
	}
	f[0][1]=1;
	for(int i=1;i<=n+1;i++)
	{
		for(int j=1;j<=cnt;j++)
		{
			for(int k=1;k<=cnt;k++)
			{
				if(!(s[j]&s[k])&&(s[j]&g[i])==s[j]&&(s[k]&g[i-1])==s[k])
				{
					f[i][j]=(f[i][j]+f[i-1][k])%mod;
				}
			}
		}
	}
	printf("%lld\n",f[n+1][1]%mod);
	return 0;
}

有个点一直没过,以为是没开\(long\) \(long\),结果是忘了取模了(T^T)

\(4.\)蒙德里安的梦想

https://www.acwing.com/problem/content/293/

我们考虑按列摆放,某列的一行用\(0\)或者\(1\)表示摆放状态

如果某行是\(1\)表示横放,并且向下一列伸出

如果某行是\(0\)表示竖放,或者说这一格是由前一列伸出的(因为这样对于这一个格子来说相当于竖放)

合并两列状态后:不存在连续的奇数个\(0\),则状态合法(因为我们竖放是\(2\times 1\)的规格,所以一列中相邻的\(1\)之间必须是偶数个\(0\))

#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 15
#define int long long
using namespace std;

bool st[1<<maxn];
int cnt;
int g[maxn];
int f[maxn][1<<maxn];

signed main()
{
	int n,m;
	while(scanf("%d%d",&n,&m)&&(n!=0||m!=0))
	{
		for(int i=0;i<(1<<m);i++)
		{
			st[i]=true;
			int cnt=0;//存放连续的0的个数
			for(int j=0;j<m;j++)
			{
				if(i>>j&1)
				{
					if(cnt&1)
					{
						st[i]=false;
						break;
					}
				}
				else cnt++;
			}
			if(cnt&1) st[i]=false;//处理高位0的情况,比如0100
		}
		memset(f,0,sizeof(f));
		f[0][0]=1;
		//第0列不横放是一种合法状态
		for(int i=1;i<=n;i++)
		{
			for(int j=0;j<(1<<m);j++)
			{
				for(int k=0;k<(1<<m);k++)
				{
					if((j&k)==0&&st[j|k])//j&k==0指两列不出现重复的1,因为对于一个横放的块,其第二列状态其实是0
					{
						f[i][j]+=f[i-1][k];
					}
				}
			}
		}
		printf("%lld\n",f[n][0]);
	}
	return 0;
}

标签:状态,cnt,动态,int,namespace,include,规划,define
From: https://www.cnblogs.com/iwillenter-top1/p/17603333.html

相关文章

  • 情景规划与财务建模2.0,如何促进企业全面预算管理的实施
    近年来,商业世界的不确定因素激增,在此背景下情景规划对于企业发展变得尤为重要。这种技术为企业提供了竞争优势,通过主动寻找增长机会和应对可控风险,构建财务模型来满足企业的稳定发展。这是一种从财务角度保持企业战略目标高效进展、发挥最大价值、拥抱最大回报的方式,往往适用于不同......
  • C/C++ 数据结构五大核心算法之动态规划算法-给你一根长度为 n 的金条,请把金条剪成 m
    动态规划也是一种分治思想,但与分治算法不同的是,分治算法是把原问题分解为若干子问题,自顶向下,求解各子问题,合并子问题的解从而得到原问题的解。动态规划也是自顶向下把原问题分解为若干子问题,不同的是,然后自底向上,先求解最小的子问题,把结果存储在表格中,在求解大的子问题时,直接从表......
  • WPF动态绑定隐藏或显示DataGrid一列
     因为datagridtemplatecolumn不在VirsualTree中,不能继承DataGrid的DataContext,所以想要绑定到datagridtemplatecolumn的visibility,需要添加一个代理 一、添加一個FrameworkElement的代理<Window.Resources><FrameworkElementx:Key="ProxyElement"DataContext......
  • 129.动态编译与静态编译
    129.动态编译与静态编译1.静态编译静态编译是将程序代码和库函数一起编译成一个可执行文件的过程。在静态编译过程中,程序代码和库函数的代码被组合在一起,形成一个独立的可执行文件,该文件可以在任何系统上运行,因为它包含了所有所需的代码和库函数。1.1优点:1.程序在运行时不需要......
  • 恶意代码分析 动态行为分析 Lab3-1 Lab3-2 Lab3-3 Lab3-4
    笔记动态分析基础,这部分还没涉及到看反汇编进行分析,主要是运行程序,然后通过监控软件检测程序运行的内容使用沙箱查看运行报告,可以获取一部分信息首先要在虚拟机上运行恶意代码:如果是DLL,可以通过rundll32.exeDLLName,ExportFun来进行执行如果是服务DLL,则需要运行其中导出的安装服......
  • tp动态匹配多级路径 app/admin/route/app.php
    //请求路径$baseUrl=request()->baseUrl();//访问地址二级目录路由匹配if(substr_count($baseUrl,'/')==3){$baseUrl=substr($baseUrl,1);//动态匹配为二级路由规则Route::rule($baseUrl,substr_replace($baseUrl,'.',strpos($baseUrl,'/',0......
  • 项目散、规划难,建筑行业的税务管理难题该如何解决?
    建筑行业作为我国国民经济的支柱产业之一,发挥着支撑和发展国民经济的重要作用。近年来,建筑业总产值与利润总额增速逐渐放缓,行业产值利润率连续五年下降,利润空间进一步缩小。同时,建筑企业普遍存在债务率高、资金周转偏慢、回收期长等问题,市场进入发展平缓期,粗放式经营已经不适合当下......
  • 面试-基本的算法要了如指掌,比如查找、排序、动态规划、分治等
    在了解这些基本算法之前还是得先了解这些基本的数据结构,这些都是要熟记与心的。基本数据结构比如:字符串、链表、二叉树、堆、栈、队列、哈希等字符串stringstr="helloworld";//使用格式//string是类。//str输出的大小,取决于size函数的返回值。链表classListNode{ pu......
  • 业务架构规划实践:专题一价值链、价值网络和精益价值流分析比较
    引言    本人在四大咨询机构从事制造业数字化咨询工作多年,见证了企业架构方法论的逐步推广和普及,其中以Togaf的4A架构的推广最为成功,被越来越多的企业应用到实际的企业架构的构建当中。而在4A架构中,又以业务架构最为重要,其对上承接企业战略,对下指引应用架构和数据架构的构建......
  • django动态创建表和动态选择实体
    开发有时需要动态创建表,创建完成后需要动态选择model对应的表,该需求如何实现1、model层  TestBlock为了动态创建表、getBlockModel为了动态选择表fromdjango.dbimportmodels#Createyourmodelshere.classTestBlock(models.Model):BLOCK_ID=models.CharFiel......