首页 > 其他分享 >P3886 [JLOI2009]神秘的生物

P3886 [JLOI2009]神秘的生物

时间:2023-04-04 22:58:07浏览次数:44  
标签:神秘 cnt ctr val int JLOI2009 P3886 ctl now

第一次接触连通块的插头dp

用最小表示法表示每个连通块,由于数据范围知道连通块最多为5个,所以用8进制即可

状态转移照模板推一推

需要注意的是对于上面来的连通块如果不连通的话需要考虑其是否还有其它地方与下方相连,如果没有则必须在此点往下相连,否则上方那个连通块将被孤立,不符合题意

但是左边而来的连通块却不需要考虑,原因是左方格子在下一行时会再次考虑其连通性,而上方却是最后一次考虑了。

点击查看代码
#include<bits/stdc++.h>
#include<unordered_map>
#define int long long
#define inf 1e18
#define inc 0xcfcfcfcf
#define N 17
#define M 500007
#define mod 1000000007
//#pragma GCC optimize(2)
//#pragma GCC optimize(3)
using namespace std;
int T=1,n,m,ans=-inf;
int g[N][N];
int vis[N];
unordered_map<int,int> f[2];
inline int Read()
{
	char ch=getchar();bool f=0;int x=0;
	for(;!isdigit(ch);ch=getchar())if(ch=='-')f=1;
	for(;isdigit(ch);ch=getchar())x=(x<<1)+(x<<3)+(ch^48);
	if(f==1)x=-x;return x;
}
int Get_s(int num,int pos){return (num<<(pos*3));}
void Insert(int pos,int S,int val)
{
	memset(vis,0,sizeof(vis));
	int cnt=0,S1=0;
	for(int i=0;i<n;++i)
	{
		int now=(S>>(i*3))&7;
		if(!now)
			continue;
		if(!vis[now])
			vis[now]=++cnt,now=cnt;
		else
			now=vis[now];
		S1^=Get_s(now,i);
	}
	if(cnt==1)
		ans=max(ans,val);
	if(f[pos].find(S1)==f[pos].end())
		f[pos][S1]=val;
	else
		f[pos][S1]=max(f[pos][S1],val);
}
int Ctdp()
{
	int now=0;
	int mxn=(1<<(n*3))-1;
	f[now][0]=0;
	f[1].clear();
	for(int i=1;i<=n;++i)
	{
		for(int j=1;j<=n;++j)
		{
			int nxt=now^1;
			for(auto k:f[now])
			{
				int S=k.first,val=k.second;
				int ctr=(S>>((j-1)*3))&7;
				int ctl=0;
				if(j!=1)
					ctl=(S>>((j-2)*3))&7;
				if(!ctl&&!ctr)
				{
					Insert(nxt,S,val);
					Insert(nxt,S^Get_s(7,j-1),val+g[i][j]);
				} 
				if(ctl&&!ctr)
				{
					Insert(nxt,S^Get_s(ctl,j-1),val+g[i][j]);
					Insert(nxt,S,val);
				}
				if(!ctl&&ctr)
				{
					Insert(nxt,S,val+g[i][j]);
					int cnt=0;
					for(int p=0;p<n;++p)
					{
						int pos=(S>>(p*3))&7;
						if(pos==ctr)
							++cnt;
					}
					if(cnt>=2)
						Insert(nxt,S^Get_s(ctr,j-1),val);
				}
				if(ctl&&ctr)
				{
					int cnt=0;
					for(int p=0;p<n;++p)
					{
						int pos=(S>>(p*3))&7;
						if(pos==ctr)
							++cnt;
					}
					if(cnt>=2)
						Insert(nxt,S^Get_s(ctr,j-1),val);
					int S1=S;
					if(ctl!=ctr)
						for(int p=0;p<n;++p)
						{
							int pos=(S>>(p*3))&7;
							if(pos==ctr)
								S1^=Get_s(ctr,p)^Get_s(ctl,p);
						}
					Insert(nxt,S1,val+g[i][j]);
				}
			}
			f[now].clear();
			now^=1;
		}
	}
	return 0; 
}
bool Solve()
{
 	//freopen("test.in","r",stdin);
	n=Read();
	for(int i=1;i<=n;++i)
		for(int j=1;j<=n;++j)
			g[i][j]=Read(),ans=max(ans,g[i][j]);
	Ctdp();
	printf("%lld\n",ans);
	return true;
}
signed main()
{
	//T=Read();
	while(T--)
		if(!Solve())
			printf("-1\n");
	return 0;
}
/*
3
16 -16 2 
15 0 0 
-11 8 8 

3
1 -5 1
-5 1 1
1 1 1

*/



标签:神秘,cnt,ctr,val,int,JLOI2009,P3886,ctl,now
From: https://www.cnblogs.com/yexinqwq/p/17288181.html

相关文章

  • 揭开二维码背后的神秘面纱用二维码识别 API 就够了
    写在前面二维码(QRcode)已经成为现代生活中不可或缺的一部分。二维码具有可靠性、快速识别、易于存储等优点,因此在广泛应用于支付、门票、社交网络、广告等方面。但是,对于......
  • 不再神秘:苹果背后的10位精英设计师
    在最近的专利纠纷案中,苹果的“秘密”不断向外界泄漏出去,而一些关于苹果工业设计团队的“机密”消息也难逃一劫。在此之前,我们也许知道苹果的首席设计师是JonathanIve,但这......
  • 2009-09-神秘东北大哥
     周末上午10点左右起床没多久的刘文轩正在出租屋回忆童年看《龙珠》动画片,去年2008年上映的剧场版勾起的回忆,无所事事的刘文轩决定把龙珠翻出来重温一遍。这个时期互联......
  • 揭开Salesforce Accredited Professional证书神秘面纱,到底含金量有多高?
    自从Salesforce宣布AccreditedProfessional计划以来,已经过去了将近两年。这些认证旨在证明备考者在Salesforce平台特定领域的广泛知识,并且仅供Salesforce合作伙伴使用。A......
  • P4587 [FJOI2016]神秘数
    首先对于数\(a_i\)和一个\(sum\)内被全部覆盖的区间,若\(a_i\lesum\),那么可以将区间覆盖到\(a_i+sum\),经典背包,不证明。那么通过这个可以推出来一种暴力做法,每一次......
  • chatgpt 神秘代码`~~
    sk-nr26uukCA5AJwloAEb5WT3BlbkFJbWaEqKghSPBDK4XZ09y1sk-PkWLSy4sFhQlquFF9D4xT3BlbkFJ5F9h5xsXouF2Bqy0wGoVsk-vzFUoZR3frqqICTaoNJqT3BlbkFJo29KX24Z0FnpPnVE0YTGsk-ed6......
  • 【Vijos1264】神秘的咒语
    problemsolutioncodes#include<iostream>#include<cstdio>#include<algorithm>#include<cstring>usingnamespacestd;constintM=505;intn,la,lb,a[M],b[M],ans=0;in......
  • Jenkins 和 Kubernetes 云上的神秘代理
    最近我们构建和部署服务的方式与原来相比简直就是突飞猛进,像那种笨拙的、单一的、用于构建单体式应用程序的方式已经是过去式了。我们努力了这么久,终于达到了现在的效果。现......
  • 朋友圈那串神秘字符背后的开源项目「GitHub 热点速览」
    ​如果你这周没刷到类似“npub1sg6plzptd64u62a878hep2kev88swjh3tw00gjsfl8f237...”的一串字符,那就说明本期GitHubTrending周榜的内容非常适合你。这是前推特创始......
  • 神秘算法 —— 线性基求交
    线性基求交:设\(A,B\)为两个线性基,\(V_A,V_B\)分别为其生成空间,则\(V_C=V_A\capV_B\)是一个线性空间,称\(A\)与\(B\)两个线性基的交为\(C\)。首先证明\(V_C\)......