ZOJ 3466 插头dp
发布日期:2022-01-31 14:08:46 浏览次数:11 分类:技术文章

本文共 1614 字,大约阅读时间需要 5 分钟。

做这题时直接在上一道题上修改的。
http://blog.csdn.net/chm517/article/details/9968775
还是多条回路的插头dp,四边形改成六边形,需要自己重推。
up,left->up1,up2,left
每个点依旧是两个插头。

#include
#include
#include
#include
typedef long long LL;using namespace std;const int N=16;const int HASH=15511;const int STATE=1000000;LL ans;int n,m,mm;int map[N][N];int ex,ey;struct HASHMAP{ int head[HASH],next[STATE],size; int state[STATE]; LL f[STATE]; void init() { size=0; memset(head,-1,sizeof(head)); } void push(int st,LL ans) { int i; int h=st%HASH; for(i=head[h];i!=-1;i=next[i]) if(state[i]==st) { f[i]+=ans; return; } state[size]=st; f[size]=ans; next[size]=head[h]; head[h]=size++; }}hm[2];void shift(int cur){ for(int i=0;i
>i);}inline int pp(int i,int k){ return k<
=0) if (map[i+1][j+tt]&&map[i+1][j+tt+1]) hm[cur^1].push(s|pp(jj,1)|pp(jj+1,1),data); if (map[i+1][j+tt+1]&&map[i][j+1]) hm[cur^1].push(s|pp(jj+1,1)|pp(jj+2,1),data); if (j+tt>=0) if (map[i+1][j+tt]&&map[i][j+1]) hm[cur^1].push(s|pp(jj,1)|pp(jj+2,1),data); continue; } if (add==1) {int tmp=cp(s,jj,jj+1,jj+2); if (j+tt>=0) if (map[i+1][j+tt]) hm[cur^1].push(tmp|pp(jj,1),data); if (map[i+1][j+tt+1]) hm[cur^1].push(tmp|pp(jj+1,1),data); if (map[i][j+1]) hm[cur^1].push(tmp|pp(jj+2,1),data); continue; } if (add==2) {hm[cur^1].push(cp(s,jj,jj+1,jj+2),data); if (i==ex&&j==ey) ans+=data; continue; } }}char str[5];void init(){ int x,y; memset(map,0,sizeof(map)); n=8; ex=-1; for (int i=0;i

转载地址:https://blog.csdn.net/chm517/article/details/9972247 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Hdu 1693 插头dp
下一篇:密码学笔记(2)——RSA密码

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月11日 15时52分32秒