博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模板—插头dp(Ural 1519 Formula 1)
阅读量:4982 次
发布时间:2019-06-12

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

括号表示法:

据说比下一个要快而且灵活。

1 #include
2 #include
3 #include
4 #define LL long long 5 #define MAXN 20000 6 #define HASH 23333 7 #define ma(x,y) memset(x,y,sizeof(x)) 8 using namespace std; 9 struct Hash_map 10 { 11 int size,first[HASH],next[MAXN]; 12 #define f(x) first[x] 13 #define n(x) next[x] 14 LL sta[MAXN],sum[MAXN]; 15 void init(){size=0;ma(first,-1);ma(sum,0);} 16 void push(LL states,LL Sum) 17 { 18 int pos=(states%HASH+HASH)%HASH; 19 for(int i=f(pos);i>=0;i=n(i)) 20 if(sta[i]==states){sum[i]+=Sum;return;} 21 sta[size]=states; 22 sum[size]=Sum; 23 n(size)=f(pos);f(pos)=size++; 24 } 25 }dp[2]; 26 int n,m,map[15][15],bin[16],fx,fy;//最后一个可行点坐标 27 int now,pre; 28 int mov[13]={
0,2,4,6,8,10,12,14,16,18,20,22,24}; 29 inline int getbit(LL st,int k){
return (st>>mov[k])&3;}//第k位状态 30 inline int pybit(LL st,int k){
return st<
=0;i--) 47 { 48 int k=getbit(st,i); 49 if(k==1)cnt--; 50 else if(k==2)cnt++; 51 if(!cnt)return i; 52 } 53 } 54 void DP(int x,int y,int k) 55 { 56 int l=getbit(dp[pre].sta[k],y-1); 57 int up=getbit(dp[pre].sta[k],y); 58 LL st=clrbit(dp[pre].sta[k],y-1,y); 59 LL v=dp[pre].sum[k]; 60 if(!l&&!up) 61 { 62 if(!map[x][y]){dp[now].push(st,v);return;} 63 if(x
>n>>m;char t;111 for(int i=1;i<=n;i++)112 for(int j=1;j<=m;j++)113 { 114 cin>>t;115 if(t=='*')map[i][j]=0;116 else map[i][j]=1;117 }118 fx=0;119 for(int i=n;i>0&&!fx;i--)120 for(int j=m;j>0&&!fx;j--)121 if(map[i][j])122 fx=i,fy=j;123 if(fx==0)puts("0");124 else cout<
<
括号表示法(这个是自己写的)

最小表示法(看不懂,下面是标程):

不过连我都能看出来它慢那它就是真的慢了。而且我也并没有觉得它好理解……

 找到一个和自己码风相似的不容易啊……

1 #include
2 3 #define LL long long 4 using namespace std; 5 const int maxn=30001,inc=3,bit=7;//3位二进制以及111的表示 6 int n,m,now,pre,code[20],bin[20],res[20];//用来表示状态的每一位的数值 7 char gp[20][20],fx,fy;//图和最后的可行点 8 struct node//离散化hash 9 { 10 int head[maxn],next[maxn],size; 11 LL sum[maxn],sta[maxn]; 12 void clear() 13 { 14 memset(head,-1,sizeof(head)); 15 size=0; 16 } 17 void push(LL st,const LL v) 18 { 19 LL hash=st%maxn; 20 for(int i=head[hash];i>=0;i=next[i]) 21 { 22 if(sta[i]==st) 23 { 24 sum[i]+=v; 25 return ; 26 } 27 } 28 sta[size]=st,sum[size]=v; 29 next[size]=head[hash],head[hash]=size++; 30 } 31 }dp[2]; 32 inline LL encode(int m)//将code转换成状态 33 { 34 LL st=0; 35 int cnt=1; 36 memset(bin,-1,sizeof(bin)); 37 bin[0]=0; 38 for(int i=m;i>=0;i--) 39 { 40 if(bin[code[i]]==-1) 41 bin[code[i]]=cnt++; 42 code[i]=bin[code[i]]; 43 st<<=inc; 44 st|=code[i]; 45 } 46 return st; 47 } 48 inline void decode(LL st,int m)//将状态转换成code 49 { 50 for(int i=0;i<=m;i++) 51 { 52 code[i]=st&bit; 53 st>>=inc; 54 } 55 } 56 void DP(int x,int y,int k)//dp具体情况具体分析 57 { 58 decode(dp[pre].sta[k],m); 59 int l=code[y-1]; 60 int up=code[y]; 61 code[y-1]=code[y]=0; 62 memcpy(res,code,sizeof(code)); 63 LL v=dp[pre].sum[k]; 64 if(!l&&!up) 65 { 66 if(gp[x][y]=='*') 67 dp[now].push(encode(m),v); 68 else if(x
0&&!fx;i--)//寻找最终的位置 131 for(int j=m;j>0&!fx;j--) 132 if(gp[i][j]=='.') 133 fx=i,fy=j; 134 if(fx==0)puts("0"); 135 else cout<
<
最小表示法(摘自某大佬)

 

转载于:https://www.cnblogs.com/Al-Ca/p/11259485.html

你可能感兴趣的文章
[BZOJ3282]Tree(LCT)
查看>>
最终版详细设计
查看>>
GenePix Pro 3.0
查看>>
html移动端 -- meta-模板 + rem
查看>>
js-控制浏览器和移动端的后退按钮 . popstate
查看>>
[QT][SQLITE]学习记录二 日期查询
查看>>
hdu 4455 Substrings
查看>>
web传参
查看>>
Python 查找binlog文件
查看>>
Git——如何将本地项目提交至远程仓库
查看>>
Convert CString to std::string
查看>>
3 - Selenium元素定位和操作
查看>>
GCC C语言 DLL范例,含源码
查看>>
冲刺第一天(补发)
查看>>
iOS开发Xcode中切换显示语言实现国际化
查看>>
C++模板学习
查看>>
nginx
查看>>
大数据平台搭建-hadoop集群的搭建
查看>>
安装一些包管理的记录 win10
查看>>
Android RecyclerView notifyDataSetChanged不起作用
查看>>