首页 > 其他分享 >J. Tile Covering

J. Tile Covering

时间:2024-07-17 18:52:23浏览次数:9  
标签:20 Covering int 600005 state Tile DP

  • 从顶层设计的角度考虑,我们并不关心具体的放置骨牌的方法,而只关心这种覆盖是否可行
  • 而一种覆盖可行等价于该覆盖中不存在“L型”
  • 于是我们就可以优化轮廓线DP的设计以省去DP中构造方案所需要的时空复杂度
  • 本题似乎还卡STL,下次涉及到大量入队出队操作的时候还是手写队列吧,毕竟也就一分钟左右的事
  • 关于程序的错误一般会出现在何处,我想你已经有了一些经验
点击查看代码
#include <bits/stdc++.h>
using namespace std;
int v[20][20],n,m;
int f[2][600005],maxn;
bool b[600005];
int q[2][600005],cnt[2];
bool opt;
void insert(int cur,int state,int w)
{
	if(opt==true)
	{
		state=state&(~(1<<m));
		state=(state<<1);
	}
	if(b[state]==false)
	{
		b[state]=true;
		q[cur][++cnt[cur]]=state;
		f[cur][state]=w;
	}
	f[cur][state]=max(f[cur][state],w);
	maxn=max(maxn,f[cur][state]);
}
int get(int state,int k)
{
	if(k==-1||k==m+1)
	{
		return 0;
	}
	return ((state>>k)&1);
}
int val(int k,int x)
{
	return x*(1<<k);
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			cin>>v[i][j];
		}
	}
	int cur=0;
	insert(0,0,0);
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=m;j++)
		{
			opt=(j==m);
			maxn=0;
			memset(b,false,sizeof(b));
			int tmp=0;
			for(int k=1;k<=cnt[cur];k++)
			{
				int state=q[cur][k];
				tmp=max(tmp,state);
				int x=get(state,j-2),y=get(state,j-1),z=get(state,j),g=get(state,j+1),w=f[cur][state];
				if(v[i][j]<=0)
				{
					insert(cur^1,state-val(j-1,y),w);
				}
				else
				{
					insert(cur^1,state-val(j-1,y),w);
					if(!(x==1&&y==1)&&!(y==1&&z==1)&&!(z==1&&g==1)&&!(x==1&&z==1))
					{
						insert(cur^1,state-val(j-1,y)+val(j-1,1),w+v[i][j]);
					}
				}
			}
			cnt[cur]=0;
			cur=cur^1;
		}
    }
	cout<<maxn<<endl;
	return 0;
}

标签:20,Covering,int,600005,state,Tile,DP
From: https://www.cnblogs.com/watersail/p/18308099

相关文章

  • 题解:AT_abc359_c [ABC359C] Tile Distance 2
    背景去中考了,比赛没打,来补一下题。分析这道题让我想起了这道题(连题目名称都是连着的),不过显然要简单一些。这道题显然要推一些式子。我们发现,和上面提到的那道题目一样,沿着对角线走台阶,纵坐标走到以后再走横坐标显然是最优策略。这时候的答案就是横纵坐标差的和的一半(这就不用......
  • auto,static,const,extern,volatile,register
    auto关键字用于声明变量的生存期为自动,auto修饰的是自动类型的变量,对于局部变量默认就是自动类型的变量,如果没有赋初值它的值就是随机值。static 修饰的变量或者函数有如下特点:static修饰的局部变量,可以延长变量的生命周期(不会被多次初始化)static修饰的全局变量或者函数只......
  • MapLibre/Martin | 使用Martin发布MBTiles地图切片包
    什么是MartinMartin是一个高性能的地图切片服务器,使用Rust编写,支持PostGIS,MBTiles,PMTiles。什么是MBTilesMBTiles是个sqlite文件,也就是说MBTiles文件是个单文件数据库。截至本文写作时,最新标准是1.3.MBTIles利用了数据库的索引机制,避免相同内容的切片重复占用空间,同时也有......
  • C语言中关键字volatile
     1:什么是volatile?    在C语言中,volatile关键字同样用于修饰变量,volatile告诉编译器该变量的值可能会在程序的控制之外被改变,因此编译器在优化代码时不能对该变量的访问进行优化,比如不能将其缓存到寄存器中,而是每次访问时都需要直接从内存中读取其值。2:变量的访问......
  • volatile关键字解析
    Java并发编程:volatile关键字解析本文转载来自于https://www.cnblogs.com/dolphin0520/​Matrix海子的Java并发编程:volatile关键字解析volatile这个关键字可能很多朋友都听说过,或许也都用过。在Java5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果。......
  • Java volatile 深度解析
    简介被volatile修饰的变量有两大特点:当写一个volatile变量时,JMM会把线程对应的本地内存中的共享变量值立即刷新回主内存中。当读一个volatile变量时,JMM会把线程对应的本地内存设置为无效,需要工作线程重新回到主内存中读取最新共享变量。所以volatile的写的内存语......
  • volatile和static的区别
    作用范围和变量类型:static关键字用于创建类级别的变量或方法,所有类的实例共享同一个static变量的副本。它还可以用于方法、初始化块和内部类。相比之下,volatile仅用于声明变量,确保在多线程环境中的可见性,使所有线程都能看到最新的变量值。内存模型:static变量在内存中有......
  • Java 如何在volatile内部调用接口
    在Java中,volatile关键字通常用于确保变量的可见性和有序性,而不是用来修饰接口或方法调用的。volatile修饰的变量会被立即同步到主存,并且在每次访问时都会从主存中重新读取,而不是从缓存中读取。这意味着对volatile变量的修改对所有线程都是可见的。然而,我们的需求似乎是在一个被......
  • Cesium 3DTiles customshader的使用-动态高度设置
    之前要编辑3DTiles 的shader来实现一些例如压平之类的操作 还需要更改源码Cesium新版本更新了3Dtiles的自定义着色器 可以直接定义两个着色器并往里面传uniform新版本添加3dtiles的方式发生了改变 原有的方式不能用了新版本必须通过fromurl函数进行异步添加即asyncfu......
  • DevExpress WinForms磁贴导航面板 & TileBar组件,让桌面应用触摸更友好!
    界面控件DevExpressWinFormsTileNavPane被设计为位于应用程序窗口的顶部(就像Ribbon一样),可以被认为是Windows桌面应用程序中传统导航元素的触摸友好版本。P.S:DevExpressWinForms拥有180+组件和UI库,能为WindowsForms平台创建具有影响力的业务解决方案。DevExpressWinForms能......