传送门

题意简述:给一个n*m的带权矩阵,求从左上角走到右下角的最大分数,每个格子只能经过最多一次,n,m≤9n,m\le9n,m≤9。


思路:

考虑轮廓线dpdpdp,但这道题并没有出现回路的限制因此需要一点巧妙地转化。

我们在加入初始值时规定第一个位置可以来一个插头,然后最后统计到最后一个点的时候特判有没有多余的插头即可。

注意在转移过程中如果有连上两个插头刚好会产生回路的状态要舍弃掉。

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){
	int ans=0,w=1;
	char ch=getchar();
	while(!isdigit(ch)){if(ch=='-')w=-1;ch=getchar();}
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans*w;
}
const int mod=1e6+7;
struct Hash{
	int mx[mod],idx[mod],tot,sta[mod];
	inline void clear(){tot=0,memset(idx,-1,sizeof(idx));}
	inline void insert(int stat,int mxn){
		int pos=stat%mod;
		if(!pos)++pos;
		while(~idx[pos]&&sta[idx[pos]]!=stat)pos=pos==mod-1?1:pos+1;
		if(~idx[pos])mx[idx[pos]]=max(mx[idx[pos]],mxn);
		else mx[idx[pos]=++tot]=mxn,sta[tot]=stat;
	}
}f[2];
int ans,n,m,a[15][15],Cas=0;
bool cur,mp[15][15];
inline int getbit(int x,int p){return (x>>((p-1)<<1))&3;}
inline void update(int&x,int p,int v){x^=(getbit(x,p)^v)<<((p-1)<<1);}
inline void solve(){
	f[cur=0].clear(),f[cur].insert(1,0),ans=-1e9;
	for(ri i=1;i<=n;++i){
		for(ri j=1;j<=m;++j){
			f[(cur^=1)].clear();
			for(ri mx,stat,p,q,tt=1;tt<=f[cur^1].tot;++tt){
				stat=f[cur^1].sta[tt],p=getbit(stat,j),q=getbit(stat,j+1),mx=f[cur^1].mx[tt];
				if(p==1&&q==2)continue;
				if(!(p+q)){
					f[cur].insert(stat,mx);
					if(mp[i][j+1]&&mp[i+1][j])update(stat,j,1),update(stat,j+1,2),f[cur].insert(stat,mx+a[i][j]);
					continue;
				}
				if((p>0)^(q>0)){
					if(i==n&&j==m){
						update(stat,j,0),update(stat,j+1,0);
						if(!stat)ans=max(ans,mx+a[i][j]);
						continue;
					}
					if(mp[i+(p>0)][j+(q>0)])f[cur].insert(stat,mx+a[i][j]);
					if(mp[i+(q>0)][j+(p>0)])update(stat,j,q),update(stat,j+1,p),f[cur].insert(stat,mx+a[i][j]);
					continue;
				}
				update(stat,j,0),update(stat,j+1,0);
				if(p==2&&q==1){f[cur].insert(stat,mx+a[i][j]);continue;}
				if(p==1){
					for(ri cnt=1,k=j+2,bit;k<=m+1;++k){
						bit=getbit(stat,k);
						if(bit==1)++cnt;
						if(bit==2)--cnt;
						if(!cnt){update(stat,k,1),f[cur].insert(stat,mx+a[i][j]);break;}
					}
					continue;
				}
				for(ri cnt=-1,k=j-1,bit;k;--k){
					bit=getbit(stat,k);
					if(bit==1)++cnt;
					if(bit==2)--cnt;
					if(!cnt){update(stat,k,2),f[cur].insert(stat,mx+a[i][j]);break;}
				}
			}
		}
		for(ri j=1;j<=f[cur].tot;++j)f[cur].sta[j]<<=2;
	}
}
int main(){
	while(~scanf("%d%d",&n,&m)){
		++Cas,memset(mp,0,sizeof(mp)),memset(a,0,sizeof(a));
		for(ri i=1;i<=n;++i)for(ri j=1;j<=m;++j)a[i][j]=read(),mp[i][j]=1;
		solve(),cout<<"Case "<<Cas<<": "<<ans<<'\n';
	}
	return 0;
}

2019.01.23 hdu3377 Plan(轮廓线dp)的更多相关文章

  1. 2019.01.23 hdu1693 Eat the Trees(轮廓线dp)

    传送门 题意简述:给一个有障碍的网格图,问用若干个不相交的回路覆盖所有非障碍格子的方案数. 思路:轮廓线dpdpdp的模板题. 同样是讨论插头的情况,只不过没有前一道题复杂,不懂的看代码吧. 代码: ...

  2. 2019.01.23 ural1519 Formula 1(轮廓线dp)

    传送门 轮廓线dpdpdp模板题. 题意简述:给一个放有障碍的网格图,问有多少种方法能使所有非障碍格子都在同一条哈密顿回路上面. 考虑用括号序列的写法来状压这个轮廓线. 用000表示没有插头,111表 ...

  3. 2019.01.23 hdu1964 Pipes(轮廓线dp)

    传送门 题意简述:给一个没有障碍的网格图,任意两个格子连通需要花费一定代价,现在求一条覆盖所有格子的哈密顿回路的总权值的最小值. 思路: 跟这道题一毛一样,除了把求和变成求最小值以外. 代码: #in ...

  4. 梦想Android版CAD控件2019.01.23更新

    下载地址:http://www.mxdraw.com/ndetail_10121.html?tdsourcetag=s_pcqq_aiomsg1. 增加异步读取CAD,DWG文件函数,MxFuncti ...

  5. 【NOI2019模拟2019.7.1】三格骨牌(轮廓线dp转杨图上钩子定理)

    Description \(n,m<=1e4,mod ~1e9+7\) 题解: 显然右边那个图形只有旋转90°和270°后才能放置. 先考虑一个暴力的轮廓线dp: 假设已经放了编号前i的骨牌,那 ...

  6. Tensorflow学习笔记2019.01.22

    tensorflow学习笔记2 edit by Strangewx 2019.01.04 4.1 机器学习基础 4.1.1 一般结构: 初始化模型参数:通常随机赋值,简单模型赋值0 训练数据:一般打乱 ...

  7. Tensorflow学习笔记2019.01.03

    tensorflow学习笔记: 3.2 Tensorflow中定义数据流图 张量知识矩阵的一个超集. 超集:如果一个集合S2中的每一个元素都在集合S1中,且集合S1中可能包含S2中没有的元素,则集合S ...

  8. HDU 4802 && HDU 4803 贪心,高精 && HDU 4804 轮廓线dp && HDU 4805 计算几何 && HDU 4811 (13南京区域赛现场赛 题目重演A,B,C,D,J)

    A.GPA(HDU4802): 给你一些字符串对应的权重,求加权平均,如果是N,P不计入统计 GPA Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  9. HDU - 4804 Campus Design(状压+轮廓线dp)

    Campus Design Nanjing University of Science and Technology is celebrating its 60th anniversary. In o ...

随机推荐

  1. 使用css方法使footer保持在页面的最底部

    使footer保持在页面的底部,是常见的需求,之前面试的时候也遇见了一个这样的问题,今天在这里记录下css实现的方式. 使footer保持在页面的底部,需要考虑header+content部分不够多的 ...

  2. 安装vCenter server 6.0

    注意,5.5的还可以直接把iso里的ova直接导入为模板,6.0之后的要拉到Windows下安装. 总路线 ESXI是服务器系统,用vsphere client连接,在client里新建一个虚拟机为W ...

  3. 【Linux 进程】fork父子进程间共享数据分析

    之前我们通过fork()函数,得知了父子进程之间的存在着代码的拷贝,且父子进程都相互独立执行,那么父子进程是否共享同一段数据,即是否存在着数据共享.接下来我们就来分析分析父子进程是否存在着数据共享. ...

  4. [leetcode]304. Range Sum Query 2D - Immutable二维区间求和 - 不变

    Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper lef ...

  5. TableView下拉刷新崩溃解决办法

    return cell;上边加判断 if(self.dataArray.count<1){ return cell; }

  6. python+selenium环境安装

    目前 selenium 版本已经升级到 3.7了,网上的大部分教程是基于 2.x写的,所 以在学习前先要弄清楚版本号,这点非常重要.本系列依然以 selenium2 为基础, 目前 selenium3 ...

  7. JFinal Web开发学习(七)使用layUI美化的登录功能

    效果: 验证码还是没有布局好.背景比较怀古. 1.写前端html login.jsp <!DOCTYPE html> <html> <head> <meta ...

  8. IIS 域名 带参数 设置重定向

    IIS里面设置重定向后,经常会出现,从百度快照里直接打不开的情况. 可以在IIS里面设置重定向的时候,把参数加上,格式如下: http://www.***.com%S%Q

  9. 在电脑上查看小米手机连接wifi时保存的密码

    手机连接的wifi,想另一个手机也连上,密码忘了. 先备份手机的资料,然后将手机连上电脑,在SD卡上MIUI-backup-allbackup文件夹中, 找到刚才备份的文件夹 点进去找到WLAN设置. ...

  10. 富文本编辑器--FCKEditor 上传图片

    FCKEditor的最新版本已经更改名称为CKEditor: 1.在页面引入fckeditor目录下的fckeditor.js <script type="text/javascrip ...