传送门

题意简述:给一个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. Django、Flask、Tornado的比较

    一:常用请求参数的接收 Django中: request.GET/POST Tornado中: self.get_query_argument()/get_query_arguments() self ...

  2. Date 时间 日期 常用方法函数

    转载自https://www.cnblogs.com/lcngu/p/5154834.html 一.java.util.Date对象用来表示时间,基本方法如下: Date mDate = new Da ...

  3. cisco 割接脚本中ssh的key生成问题

    昨晚割接某企业4506更换4507过程中,运维工程师问crypto key generate rsa这个步骤是不是要单独出来进行刷配置,其实不需要的单独出来的crypto key generate r ...

  4. tcp中的keepalive(转)

    理解Keepalive(1) 大家都听过keepalive,但是其实对于keepalive这个词还是很晦涩的,至少我一直都只知道一个大概,直到之前排查线上一些问题,发现keepalive还是有很多玄机 ...

  5. GridView中CheckBox单击事件(oncheckedchanged)

    在GridView中加入 CheckBox控件,想通过单击选中出现如下图所示效果: 具体做法是: 前台GV部份省掉.只加关键的CheckBox部份. view plaincopy to clipboa ...

  6. [leetcode]270. Closest Binary Search Tree Value二叉搜索树中找target的最接近值

    Given a non-empty binary search tree and a target value, find the value in the BST that is closest t ...

  7. linux操作系统重启后 解决nginx的pid消失问题

    重启了linux服务器之后,进程性的 nginx -s stop后再次启动nginx -s reload ,总是会报错误nginx: [error] open() "/alidata/ser ...

  8. ApplicationContextAware的使用

    一.这个接口有什么用? 当一个类实现了这个接口(ApplicationContextAware)之后,这个类就可以方便获得ApplicationContext中的所有bean.换句话说,就是这个类可以 ...

  9. mysql定位慢查询

    mysql定位慢查询 //显示数据库的状态 show status; //显示执行了多少次插入 show status like 'com_insert'; //显示执行了多少次更新 show sta ...

  10. IOS安卓常见问题

    一.IOS自带safari浏览器   1.safari不支持fixed+input输入框.   解决方案: http://www.haorooms.com/post/ios_fixed_input   ...