括号表示法:
据说比下一个要快而且灵活。
1 #include2 #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 #include2 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< <