首页 > 其他分享 >【模板】插头 DP

【模板】插头 DP

时间:2024-07-16 23:18:50浏览次数:14  
标签:插头 Set cur int state DP && 模板

  • 为了利用位运算的良好性质,采用四进制状态压缩代替三进制
  • 通过哈希表压缩有限的状态
  • 与普通的按行滚动的滚动数组不同,插头DP中的滚动数组是按格滚动的
  • 因为布尔数组值默认为false,所以我们可以用“true”代表“可通行”
  • 转移时需要找到与之匹配的括号——实现算法时不能够总是代入理想模型
点击查看代码
//轮廓线DP 
#include <bits/stdc++.h>
using namespace std;
const int M=100007;
long long f[2][100105];
int h[2][100105];
bool g[15][15];
int ei,ej,n,m;
bool opt;
queue<int>q[2];
int find(int cur,int state)
{
	int t=state%M;
	while(h[cur][t]!=-1&&h[cur][t]!=state)
	{
		t++;
		if(t==M)
		{
			t=0;
		}
	}
	return t;
}
int get(int state,int k)
{
	return (state>>(k*2))&3;
}
int Set(int k,int va)
{
	return va*(1<<(2*k));
}
void insert(int cur,int state,long long w)
{
	if(opt==true)
	{
		state=(state<<2);
	}
	int t=find(cur,state);
	if(h[cur][t]==-1)
	{
		h[cur][t]=state;
		q[cur].push(t);
	}
	f[cur][t]+=w;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			char c;
			cin>>c;
			if(c=='.')
			{
				g[i][j]=true;
				ei=i;
				ej=j;
			}
		}
	}
	memset(h,-1,sizeof(h));
	insert(0,0,1);
	long long ans=0;
	int cur=1;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			opt=(j==m);
			memset(h[cur],-1,sizeof(h[cur]));
			memset(f[cur],0,sizeof(f[cur]));
			cur=cur^1;
			while(!q[cur].empty())
			{
				int t=q[cur].front(),state=h[cur][t];
				int x=get(state,j-1),y=get(state,j);
				q[cur].pop();
				if(g[i][j]==false)
				{
					if(x==0&&y==0)
					{
						insert(cur^1,state,f[cur][t]);
					}
				}
				else
				{
					if(x==0&&y==0)
					{
						if(g[i][j+1]&&g[i+1][j])
						{
							insert(cur^1,state+Set(j-1,1)+Set(j,2),f[cur][t]);
						}
					}
					else if(x==0)
					{
						if(g[i][j+1])
						{
							insert(cur^1,state,f[cur][t]);
						}
						if(g[i+1][j])
						{
							insert(cur^1,state+Set(j-1,y)-Set(j,y),f[cur][t]);
						}
					}
					else if(y==0)
					{
						if(g[i+1][j])
						{
							insert(cur^1,state,f[cur][t]);
						}
						if(g[i][j+1])
						{
							insert(cur^1,state+Set(j,x)-Set(j-1,x),f[cur][t]);
						}
					}
					else if(x==y)
					{
						int s=1;
						if(x==1)
						{
							for(int k=j+1;k<=m;k++)
							{
								if(get(state,k)==1)
								{
									s++;
								}
								else if(get(state,k)==2)
								{
									s--;
									if(s==0)
									{
										insert(cur^1,state-Set(j-1,x)-Set(j,y)-Set(k,1),f[cur][t]);
										break;
									}
								}
							}
						}
						else if(x==2)
						{
							for(int k=j-2;k>=0;k--)
							{
								if(get(state,k)==1)
								{
									s--;
									if(s==0)
									{
										insert(cur^1,state-Set(j-1,x)-Set(j,y)+Set(k,1),f[cur][t]);
										break;
									}
								}
								else if(get(state,k)==2)
								{
									s++;
								}
							}
						}
					}
					else
					{
						if(x==1&&y==2)
						{
							if(i==ei&&j==ej)
							{
								ans+=f[cur][t];
							}
						}
						else if(x==2&&y==1)
						{
							insert(cur^1,state-Set(j-1,x)-Set(j,y),f[cur][t]);
						}
					}
				}
			}
		}
	}
	cout<<ans<<endl;
	return 0;
}

标签:插头,Set,cur,int,state,DP,&&,模板
From: https://www.cnblogs.com/watersail/p/18306321

相关文章

  • DP-背包问题-0/1背包
    第一次写blog,不好见谅!今天主要记录在学习背包时的感想以及个人理解。0/1背包疯狂的采药题目背景此题为纪念LiYuxiang而生。题目描述LiYuxiang是个天资聪颖的孩子,他的梦想是成为世界上最伟大的医师。为此,他想拜附近最有威望的医师为师。医师为了判断他的资质,给他出了一......
  • 关于静态文件目录与模板引用和Nginx location块的适配设置
    项目配置文件内关于静态文件的设置项#静态文件的URL前缀STATIC_URL='/static/'#项目根目录的静态文件目录STATICFILES_DIRS=[os.path.join(BASE_DIR,'static'),os.path.join(BASE_DIR,'parallel/static'),os.path.join(BASE_DIR,'blog/static&#......
  • 喜欢dp动态规划的第二天(暑假提升)
    不要失去信心,只要坚持不懈,就终会有成果。——钱学森dp动态规划题目详解--第二天前言1、最长定差子序列2、最长等差数列3、等差数列划分II-子序列4、回文子串5、总结前言由于上一期的动态规划我觉的太过于繁琐,所以这次简化一下操作,题目概念解析将不会再写,我直......
  • 海量元宇宙场景模板,视创云展解锁你的无限创意虚拟空间!
    ​一站式元宇宙虚拟活动云平台视创云展,集成了海量的元宇宙场景模板,并借助其强大的模块化功能体系,使得用户能够轻松跨越技术门槛,迅速创作出高质量的3D场景。用户可自由发挥创意,构建出独一无二的元宇宙空间,完美契合多样化的场景应用需求。1、海量模板,随心选择:视创云展拥有海量......
  • AT_dp_a Frog 1 题解
    Frog1题面翻译NNN个石头,编号为1,2......
  • dm/dp含义和接线
    dm/dp含义和接线DM:dataminus,DM是USB的数据线D-(白色线)DP:dataplusDP是USB的数据线D+(绿色线)usb接线排列方式是VCC,D-,D+,GNDDigitalPositive&DigitalMinusUSB的通信都是由主机发起的(iic类似)USB使用差分传输模式,有两条数据线,分别是:a.USB数据......
  • 模板——类模板2——继承,文件,友元
    1.类模板与继承1.1当子类继承的父类是一个类模板时,子类在声明时,要指定父类中T的类型1.2如果不指定,编译器无法给子类分配内存1.3如果想灵活指定父类中的T的类型,子类也需变成类模板template<classT>classBase{public: Tage;};//classSon:publicBase//错误,c++编译......
  • 模板——类模板1--与函数的关系
    1.类模板基本语法template<classT,classT2>类template<classNameType,classAgeType>classPerson{public: Person(NameTypename,AgeTypeage) { this->m_name=name; this->m_age=age; } voidShowPerson() { cout<<"姓名:&quo......
  • 类模板案例——数组类封装(vector<>的逻辑代码)
    .hpp文件#pragma#include<iostream>usingnamespacestd;template<classT>classMy_arry{public: My_arry(intcapacity)//赋初值 { this->m_capacity=capacity;//容量 this->m_Arry_size=0;//大小 this->m_Arry_Addres=newT[capacity];......
  • DedeCMS网站模板的title、description、keywords应该怎么写?
    首页​<title>{dede:global.cfg_webname/}-{dede:global.cfg_websubtitle/}</title><metaname="description"content="{dede:global.cfg_description/}"><metaname="keywords"content="{dede:global.cfg_k......