所谓插头dp,就是使用插头的dp
(逃)
解析
好难呀qwq
终于算是学明白了吧
推荐博客
字太多了不想打了
自己过去看吧
感觉写的非常清晰了
代码
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define il inline
const int N=2e6+100;
const int mod=1333331;
inline ll read() {ll x=0,f=1;char c=getchar();while(!isdigit(c)) {if(c=='-') f=-1;c=getchar();}while(isdigit(c)) {x=x*10+c-'0';c=getchar();}return x*f;
}
ll n,m,x;
int mi[14],a[14][14];
int tot[2],fi[2][mod],nxt[2][N];
ll sta[2][N],val[2][N];
int now,lst;
void ins(int key,ll v) {int o=key%mod;for(int i=fi[now][o]; i; i=nxt[now][i]) {if(sta[now][i]==key) {val[now][i]+=v;return;}}++tot[now];nxt[now][tot[now]]=fi[now][o];fi[now][o]=tot[now];sta[now][tot[now]]=key;val[now][tot[now]]=v;return;
}
int X,Y;
int bit[16];
ll ans;
signed main() {
#ifndef ONLINE_JUDGEfreopen("a.in","r",stdin);freopen("a.out","w",stdout);
#endifn=read();m=read();bit[0]=1;for(int i=1; i<=m+1; i++) bit[i]=bit[i-1]<<2;for(int i=1; i<=n; i++) {for(int j=1; j<=m; j++) {char c;scanf(" %c",&c);if(c=='.') {a[i][j]=1;X=i;Y=j;}}}now=1;ins(0,1);for(int i=1; i<=n; i++) {for(int j=1; j<=tot[now]; j++){sta[now][j]<<=2;}for(int j=1; j<=m; j++) {lst=now;now^=1;memset(fi,0,sizeof(fi));tot[now]=0;//printf("\n----------(%d %d)\n",i,j);for(int k=1; k<=tot[lst]; k++) {int st=sta[lst][k];ll res=val[lst][k];if(st>=bit[m+1]) continue;//printf(" st=%lld res=%lld\n",st,res);int r=(st>>((j-1)*2))%4,d=(st>>((j)*2))%4;if(a[i][j]==0) {if(!r&&!d) ins(st,res);} else if(!r&&!d) {if(a[i+1][j]&&a[i][j+1]) ins(st+2*bit[j]+bit[j-1],res);} else if(!r&&d) {if(a[i][j+1]) ins(st,res);if(a[i+1][j]) ins(st-d*bit[j]+d*bit[j-1],res);} else if(r&&!d) {if(a[i+1][j]) ins(st,res);if(a[i][j+1]) ins(st-r*bit[j-1]+r*bit[j],res);} else if(r==2&&d==2) {int flag=1;for(int p=j-2; p>=0; p--) {int o=(st>>(p*2))%4;if(o==1) flag--;else if(o==2) flag++;if(flag==0) {ins(st-2*bit[j-1]-2*bit[j]+bit[p],res);break;}}} else if(r==1&&d==1) {int flag=1;for(int p=j+1; p<=m; p++) {int o=(st>>(p*2))%4;if(o==1) flag++;else if(o==2) flag--;if(flag==0) {ins(st-bit[j-1]-bit[j]-bit[p],res);break;}}} else if(r==2&&d==1) {ins(st-bit[j]-2*bit[j-1],res);} else if(r==1&&d==2) {if(i==X&&j==Y) ans+=res;}}}}printf("%lld\n",ans);return 0;
}
/*14 3 1 22 7 5 03 4 -10 19 10 1 0
*/