hdu3377
题解:
简单的插头dp
加上一个代价即可
代码:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,HASH=,STATE=,M=1e9+;
typedef long long ll;
int n,m,ch[N],code[N],mp[N][N],mp2[N][N];
struct HASHMAP
{
int head[HASH],next[STATE],size;
ll state[STATE],f[STATE];
void init()
{
size=;
memset(head,-,sizeof(head));
}
void push(ll st,ll ans)
{
int h=st%HASH;
for (int i=head[h];i!=-;i=next[i])
if (state[i]==st)
{
f[i]=max(ans,f[i]);
return;
}
state[size]=st;
f[size]=ans;
next[size]=head[h];
head[h]=size++;
}
}hm[];
void decode(ll st)
{
for (int i=m;i>=;i--)
{
code[i]=st&;
st>>=;
}
}
ll encode()
{
int cnt=;
ll st=;
memset(ch,-,sizeof(ch));
ch[]=;ch[]=;
for (int i=;i<=m;i++)
{
if (ch[code[i]]==-)ch[code[i]]=cnt++;
code[i]=ch[code[i]];
st<<=;
st|=code[i];
}
return st;
}
void shift()
{
for (int i=m;i;i--)code[i]=code[i-];
code[]=;
}
void dp(int r,int c,int cur)
{
for (int k=;k<hm[cur].size;k++)
{
decode(hm[cur].state[k]);
int up=code[c],left=code[c-];
if ((r==&&c==)||(r==n&&c==m))
{
if (!up&&!left)
{
if (c<m)
{
code[c]=;
code[c-]=;
hm[cur^].push(encode(),hm[cur].f[k]+mp[r][c]);
}
if (r<n)
{
code[c]=;
code[c-]=;
if (m==c)shift();
hm[cur^].push(encode(),hm[cur].f[k]+mp[r][c]);
}
}
if (up||left)
{
code[c]=code[c-]=;
if (m==c)shift();
hm[cur^].push(encode(),hm[cur].f[k]+mp[r][c]);
}
continue;
}
if (up&&left)
{
if (up!=left)
{
int t=max(up,left);
code[c]=code[c-]=;
for (int i=;i<=m;i++)
if (code[i]==left||code[i]==up)code[i] = t;
if (m==c) shift();
hm[cur^].push(encode(),hm[cur].f[k]+mp[r][c]);
}
}
else if (up||left)
{
if (c<m)
{
code[c-]=;
code[c]=up|left;
if (m==c)shift();
hm[cur^].push(encode(),hm[cur].f[k]+mp[r][c]);
}
if (r<n)
{
code[c-]=up|left;
code[c]=;
if (m==c) shift();
hm[cur^].push(encode(),hm[cur].f[k]+mp[r][c]);
}
}
else
{
if (c<m&&r<n)
{
code[c-]=code[c]=;
hm[cur^].push(encode(),hm[cur].f[k]+mp[r][c]);
}
code[c]=code[c-]=;
if (c==m) shift();
hm[cur^].push(encode(),hm[cur].f[k]);
}
}
}
int main()
{
int cas=;
while (~scanf("%d%d",&n,&m))
{
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)scanf("%d", &mp[i][j]);
if (n==&&m==)
{
printf("Case %d: %d\n",++cas,mp[][]);
continue;
}
if (n<m)
{
for (int i=;i<=m;i++)
for (int j=;j<=n;j++)mp2[i][j]=mp[j][i];
for (int i=;i<=m;i++)
for (int j=;j<=n;j++)mp[i][j]=mp2[i][j];
swap(n,m);
}
int cur=;
hm[cur].init();
hm[cur].push(,);
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
hm[cur^].init();
dp(i,j,cur);
cur^=;
}
ll ans=-1e18;
for (int i=;i<hm[cur].size;i++)ans=max(ans,hm[cur].f[i]);
printf("Case %d: %lld\n",++cas,ans);
}
return ;
}
hdu3377的更多相关文章
- HDU3377 Plan
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3377 简单路径要求权值最大,那么为了回避括号序列单独插头的情况特判多,考虑使用最小表示法. #incl ...
- 2019.01.23 hdu3377 Plan(轮廓线dp)
传送门 题意简述:给一个n*m的带权矩阵,求从左上角走到右下角的最大分数,每个格子只能经过最多一次,n,m≤9n,m\le9n,m≤9. 思路: 考虑轮廓线dpdpdp,但这道题并没有出现回路的限制因 ...
- hdu3377之简单路径求最值
Plan Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submi ...
- 初探插头dp
开学那个月学了点新东西,不知道还记不记得了,mark一下 感觉cdq的论文讲的很详细 题主要跟着kuangbin巨做了几道基础的 http://www.cnblogs.com/kuangbin/arc ...
随机推荐
- leecode第十一题(盛最多水的容器)
class Solution { public: int maxArea(vector<int>& height) { int len=height.size();//错过,少了i ...
- 人脸识别最新开发经验demo分享
本来打算做个C#版demo,但没用成功,基于虹软的免费人脸识别技术 过程如下: 1. 传入一张单人脸照片: 2.调用检测人脸函数ASFDetectFaces,成功返回人脸信息的指针: 3.使用 Mar ...
- PySpark笔记
spark源码位置:https://github.com/apache/spark Spark Core核心RDD及编程 什么是RDD:1.是一个抽象类不能直接使用,在子类中实现抽象方法是一个抽象类不 ...
- Codeforces 960D - Full Binary Tree Queries
960D - Full Binary Tree Queries 思路: 用move1[i]记录第i层第1种操作移动的个数(对这一层的个数取模) 用move2[i]记录第i层第2种操作移动的个数(对这一 ...
- 第 8 章 容器网络 - 051 - 在 overlay 中运行容器
在 overlay 中运行容器 运行一个 busybox 容器并连接到 ov_net1: docker run -itd --name bbox1 --network ov_net1 busybox ...
- pycharm设置连接github
pycharm与guthub连起来,推送代码会方便一些 教程很多,转发一个:https://www.cnblogs.com/feixuelove1009/p/5955332.html
- 最简单的TTcpServer与TTcpClient通信实例-Delphi
unit TcpSCDemo;//最简单的TTcpServer与TTcpClient通信实例-Delphi //Borland推出TTcpServer与TTcpClient作为主要的网络通信控件,意味 ...
- 单细胞RNA-seq比对定量用什么工具好?使用哪个版本的基因组?数据来说话
这么多工具和基因组版本,选择困难症犯了,到底用哪个好呢? 2018 nature - Developmental diversification of cortical inhibitory inte ...
- 77. Combinations (java 求C(n,k)的组合,排除重复元素)
题目: Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. 解析:同求全 ...
- 百度基础架构组-实习生面试(2016.08 java后台开发)
一.项目 1.Spring MVC与Struts2的区别: 2.MVC三层是如何工作的?比如:要访问一个Url?a=xx&b=xx,怎么找到相应的资源,怎么运算,怎么返回等? 3.数据库myb ...