题解:

简单的插头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的更多相关文章

  1. HDU3377 Plan

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3377 简单路径要求权值最大,那么为了回避括号序列单独插头的情况特判多,考虑使用最小表示法. #incl ...

  2. 2019.01.23 hdu3377 Plan(轮廓线dp)

    传送门 题意简述:给一个n*m的带权矩阵,求从左上角走到右下角的最大分数,每个格子只能经过最多一次,n,m≤9n,m\le9n,m≤9. 思路: 考虑轮廓线dpdpdp,但这道题并没有出现回路的限制因 ...

  3. hdu3377之简单路径求最值

    Plan Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  4. 初探插头dp

    开学那个月学了点新东西,不知道还记不记得了,mark一下 感觉cdq的论文讲的很详细 题主要跟着kuangbin巨做了几道基础的 http://www.cnblogs.com/kuangbin/arc ...

随机推荐

  1. 【C#】调用2.0踩过的坑

    1.初始化[DllImport(“libarcsoft_face_engine.dll”, EntryPoint = “ASFInitEngine”, CallingConvention = Call ...

  2. ubuntu18+gtx1060 +cuda9+cudnn-v7+opencv3.1.0 配置深度学习环境

    将笔记本的ubuntu系统更新到18版本后重新配置深度学习环境,在此记载方便日后参考 具体配置为 Ubuntu18.04+gtx1060+opencv-3.1 第1步 安装依赖包 sudo apt-g ...

  3. 量化投资的Python库——Tushare

    本来想用python自带的help命令和dir命令,来写一个关于Tushare库的使用手册呢,但是后来发现了Tushare的官方网站, ̄□ ̄||,网址如下: http://tushare.org/ 把 ...

  4. Axure 第一次接触动态面板

    动态面板可以理解为有多维空间的一个容器,里面可以设置多个state,每个state里面可以放多个元件 先把对应的元件设置为动态面板并且隐藏: 本段教程主要包括三种应用场景: 1.邮箱不为空.密码为空时 ...

  5. ThinkPHP实用项

    跟踪信息 – 两种模式 – Sql调试 – 性能调试

  6. 雷林鹏分享:C# 判断

    C# 判断 判断结构要求程序员指定一个或多个要评估或测试的条件,以及条件为真时要执行的语句(必需的)和条件为假时要执行的语句(可选的). 下面是大多数编程语言中典型的判断结构的一般形式: 判断语句 C ...

  7. English trip V1 - B 3. I'd Like a Room,Please 请给我一间房? Teacher:Julia Key:

    In this lesson you will learn to say what you need. 课上内容(Lesson) twin size bed  单人床 elevator     n. ...

  8. 4步win7下简单FTP服务器搭建(试验成功)

    本文介绍通过win7自带的IIS来搭建一个只能实现基本功能的FTP服务器,第一次装好WIN7后我愣是没整出来,后来查了一下网上资料经过试验后搭建成功,其实原理和步骤与windows前期的版本差不多,主 ...

  9. linux搭建DHCP

    动态主机配置协议(DHCP,Dynamic Host Configuration Protocol),该协议用于自动管理局域网内主机的IP地址.子网掩码.网关地址及DNS地址等参数,可以有效地提升IP ...

  10. Two Melodies CodeForces - 813D (DP,技巧)

    https://codeforces.com/problemset/problem/813/D dp[i][j] = 一条链以i结尾, 另一条链以j结尾的最大值 关键要保证转移时两条链不能相交 #in ...