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 ...
随机推荐
- axios写法
- Codeforces 1009 F - Dominant Indices
F - Dominant Indices 思路:树上启发式合并 先跑轻子树,然后清除轻子树的信息 最后跑重子树,不清除信息 然后再跑一遍轻子树,重新加回轻子树的信息 由于一个节点到根节点最多有logn ...
- Codeforces 493C - Vasya and Basketball
C. Vasya and Basketball 题目链接:http://codeforces.com/problemset/problem/493/C time limit per test 2 se ...
- lua --- 函数的本质
1.lua中的函数是带有此法界定的第一类值. 2.创建一个函数的过程,本质上就是一个创建赋值语句的过程. 常见的创建函数的过程: function fun() print("Hello wo ...
- 环境变量LD_LIBRARY_PATH的传递
http://bbs.chinaunix.net/thread-3680861-1-1.html execv明显没有传环境变量,execle或execve才会带在启动shell设置的LD_LIBRAR ...
- gradlew 的https代理设定
在内网编译vlc for Android 时, 总是在 [./gradlew assemble] 卡住, 在网上找到了设置代理的方法: 在gradlew 的同一目录,建立一个 gradle.prope ...
- WPF触发器(Trigger)
WPF触发器(Trigger.DataTrigger.EventTrigger) WPF中有种叫做触发器的东西(记住不是数据库的trigger哦).它的主要作用是根据trigger的不同条件来自动更改 ...
- <转载>MacOS下安装小米SQL优化工具soar
原文链接:https://www.cnblogs.com/QuestionsZhang/p/10326105.html 1 下载源码包 赋予权限 wget https://github.com/Xia ...
- 关于OkHttp同步请求的小错误
今天进行OkHttp的同步请求 写的都是按照官方的去写的 但是返回的东西却不是我想要的 原因是我直接拿到Response后,直接Response.toString,想要拿到返回值 但是这样是错误的,正 ...
- canvas获取摄像头的图像
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAugAAAF3CAIAAAB44CnMAAAgAElEQVR4nOy92a4kx5am1y8lQAIkCI