一种可以直接相乘,压缩成 12 12 12,但 ( 2 , 6 ) (2,6) (2,6)也是 12 12 12,会有重复,在哈希表里会耗更多时间;
一种可以采用某种进制,若数对 ( x , y ) (x,y) (x,y)满足 x , y ∈ [ 0 , 9 ] x,y\in[0,9] x,y∈[0,9]那么可以压缩成 4 ∗ 10 + 3 = 43 4*10+3=43 4∗10+3=43,而且能压缩成 43 43 43的只有数对 ( 4 , 3 ) (4,3) (4,3),减少重复,效率就会增加。
那么字符串若全是小写字母,则可以压缩成 27 27 27进制。
应用 记忆化搜索在搜索若想实现记忆化,但空间会爆炸的话,那么就可以用哈希!
哈希表中每一位不仅存下压缩后的状态,还要存下对应的搜索出来的值。
若不用哈希的搜索是这样的:
int dfs(int x,int y) { if(x==1&&y==1) return 1; else { int s=0; for(int i=1;i<x;i++) s+=dfs(i,y-1); return s; } }用了哈希实现记忆化就是这样的:
int check(int i,int y) { int x=i*y%p; while(hash[x].use) { if(hash[x].i==i&&hash[x].y==y) { return x; } } return -x;//如果是负数代表没有找到! } void dfs(int x,int y) { if(x==1&&y==1) return 1; else { int s=0; for(int i=1;i<x;i++) { int bz=check(i,y-1); if(bz>0) s+=hash[bz].ans; else { int t=dfs(i,y-1); s+=t; bz=-bz;//取相反数变回原来的下标 hash[bz].ans=t; hash[bz].i=i; hash[bz].y=y; } } } }