2019.01.23 hdu3377 Plan(轮廓线dp)
传送门
题意简述:给一个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)的更多相关文章
- 2019.01.23 hdu1693 Eat the Trees(轮廓线dp)
传送门 题意简述:给一个有障碍的网格图,问用若干个不相交的回路覆盖所有非障碍格子的方案数. 思路:轮廓线dpdpdp的模板题. 同样是讨论插头的情况,只不过没有前一道题复杂,不懂的看代码吧. 代码: ...
- 2019.01.23 ural1519 Formula 1(轮廓线dp)
传送门 轮廓线dpdpdp模板题. 题意简述:给一个放有障碍的网格图,问有多少种方法能使所有非障碍格子都在同一条哈密顿回路上面. 考虑用括号序列的写法来状压这个轮廓线. 用000表示没有插头,111表 ...
- 2019.01.23 hdu1964 Pipes(轮廓线dp)
传送门 题意简述:给一个没有障碍的网格图,任意两个格子连通需要花费一定代价,现在求一条覆盖所有格子的哈密顿回路的总权值的最小值. 思路: 跟这道题一毛一样,除了把求和变成求最小值以外. 代码: #in ...
- 梦想Android版CAD控件2019.01.23更新
下载地址:http://www.mxdraw.com/ndetail_10121.html?tdsourcetag=s_pcqq_aiomsg1. 增加异步读取CAD,DWG文件函数,MxFuncti ...
- 【NOI2019模拟2019.7.1】三格骨牌(轮廓线dp转杨图上钩子定理)
Description \(n,m<=1e4,mod ~1e9+7\) 题解: 显然右边那个图形只有旋转90°和270°后才能放置. 先考虑一个暴力的轮廓线dp: 假设已经放了编号前i的骨牌,那 ...
- Tensorflow学习笔记2019.01.22
tensorflow学习笔记2 edit by Strangewx 2019.01.04 4.1 机器学习基础 4.1.1 一般结构: 初始化模型参数:通常随机赋值,简单模型赋值0 训练数据:一般打乱 ...
- Tensorflow学习笔记2019.01.03
tensorflow学习笔记: 3.2 Tensorflow中定义数据流图 张量知识矩阵的一个超集. 超集:如果一个集合S2中的每一个元素都在集合S1中,且集合S1中可能包含S2中没有的元素,则集合S ...
- 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 ...
- HDU - 4804 Campus Design(状压+轮廓线dp)
Campus Design Nanjing University of Science and Technology is celebrating its 60th anniversary. In o ...
随机推荐
- 多线程通信(wait和notify)
线程通信概念: 线程是操作系统中独立的个体,但这些个体如果不经过特殊的处理就不能成为一个整体,线程间的通信就成为整体的必用方式之一.当线程存在通信指挥,系统间的交互性会更强大,在提高CPU利用率的同时 ...
- IE6、7下overflow:hidden失效的问题
问题产生原因: 当父元素的直接子元素或者下级子元素的样式拥有position:relative或者position:absolute属性时,父元素的overflow:hidden属性就会失效. 例如: ...
- echarts柱形图x轴显示不全或者每隔一个不显示的问题
问题原因可能:x轴数据间隔太小: 问题解决: 1.调整间隔属性 xAxis: { type: 'category', //坐标轴斜着显示 axisLabel: { interval:0, rotate ...
- Java运算符号,对象赋值,别名
生活发生的一切,才会促使着我继续前行,今天继续更新哦,看书中的代码练习. 例子1 引入net.mindview.util.Print.* ,方便打印结果. package com.date0529; ...
- c#Md5 32位加密结果少了两个0的原因
今天碰到一个问题, md5加密之后与网站上md5加密少了两位, 仔细看区别是少了两个零 E1ADC3949BA59ABBE56E057F2F883E 我的md5 E10ADC3949BA59AB ...
- c#devexpres窗体划分 以及panelcontrol 相关操作
想模仿flashfxp 做一个svn上传的客户端 左侧为本地目录,右侧为svn服务器目录 准备用devexpress 的 控件实现,顺便练习一下devexpress 相关使用. 1:要实现菜单栏工具 ...
- 15.Mysql中的安全问题
15.SQL中的安全问题15.1 SQL注入简介SQL是用来和数据库交互的文本语言.SQL注入(SQL Injection)是利用数据库的外部接口将用户数据插入到实际的SQL中,以达到入侵数据库乃至操 ...
- (转)关于 HTTP meta 的 IE=edge 说明
关于 HTTP meta 的 IE=edge 说明 陌生标记标记一: < meta http-equiv = "X-UA-Compatible" content = &quo ...
- WebDriverException:Message:'geckodriver'executable needs to be in Path
geckodriver是一原生态的第三方浏览器,对于selenium3.x版本都会使用geckodriver来驱动firefox,所以需要下载geckodriver.exe,下载地址:https:// ...
- 20172306《Java程序设计》第五周学习总结
20172306 2016-2017-2 <Java程序设计>第五周学习总结 教材学习内容总结 第五章主要学习了if以及while的语句的运用 运算符:== 代表相等,是两个之间的内存地址 ...