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 ...
随机推荐
- POJ-2386.Lakecounting(DFS求连通块)
本题是一道连通块的入门题,用来练手,后续还会更新连通块的题目. 本题大意:一个n * m 的陆地上面有很多水洼,让你统计水洼的个数并输出. 本题思路:按照顺序遍历陆地,如果发现水洼就将它的八连块都进行 ...
- Node使用 Express框架,实现文件上传
一 安装依赖包 npm install multer --save 二 客户端上传文件 <!DOCTYPE html> <html> <head> <meta ...
- python——线程相关
使用python的threading中的Thread 下面是两种基本的实现线程的方式: 第一种方式———— #coding=utf-8 """ thread的第一种声明及 ...
- f5版本升级
1)上传系统IOS及Hotfix 点击import按钮,选择要上传的文件.上传成功的话就会显示上传成功的10.2.4的iso文件 2)通过CLI命令行方式上传补丁 通过SSH工具将ISO以及Hotfi ...
- Python: 高阶函数与lambda表达式
缘由: python语法简单一看就会,但用在实处,想因为少于实战,总感觉有些捉襟. 翻阅跟踪youtube_dl源码,看到filter()函数用法,及其中lambda表达式,感觉好有意思,就补下课,记 ...
- wk1&2 字符串
[CQ] 自增怎么样都增了,赋值不一定: int x = 2; int y = 2; int i = ++x; int j = y++; System.out.println(x); System.o ...
- 支付宝H5 与网页端支付开发
在日常生活中,我们基本上都是进行微信与支付宝的支付方式尽心支付,这种方式确实大大便利了我们的生活,那么如何在我们的产品中进行微信与支付宝支付的植入开发呢? 我们先进行支付宝的H5与网页端支付开发,这里 ...
- Composer 安装以及使用方法
Composer 是 PHP 的一个依赖管理工具.它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们. Linux 下安装 curl -sS https://getcomposer.org/ ...
- Django+Uwsgi+Nginx部署
一 uwsgi介绍 uWSGI是一个Web服务器,它实现了WSGI协议,uwsgi, http等协议. Nginx中HttpUwsgiMoule的作用是与uWSGI服务器进行交换 1 WSGI是一种W ...
- oracle学习之数据库数据保存成文件
常常需要将数据库中的数据生成文档,由于比较喜欢脚本的方式,所以就需要使用spool的时候进行格式设置,以下简单整理了一下oracle中进行格式设置的一些东西,一共十八条,其实常用的也就那么几个,稍后会 ...