bzoj1814: Ural 1519 Formula 1
2017-06-15 21:14
393 查看
传送门
插头DP入门题。
首先可以看一下cdq的PPT
然后按照类似的做法就可以了。
注意,哈希表开太大会在赋值时TLE,但是开太小会导致哈希效率不高。
经计算,本题状态数不到8W,所以开20W足够了。
插头DP入门题。
首先可以看一下cdq的PPT
然后按照类似的做法就可以了。
注意,哈希表开太大会在赋值时TLE,但是开太小会导致哈希效率不高。
经计算,本题状态数不到8W,所以开20W足够了。
#include<cmath> #include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define sz 200005 #define ll long long using namespace std; int hs[sz],tot[2],sta[2][sz],bit[30]; int n,m,c,ex,ey,mp[15][15]; ll dp[2][sz],ans; char s[15]; void add(int s,ll num){ int pos=s%sz; while (hs[pos]!=-1){ if (sta[c][hs[pos]]==s){ dp[c][hs[pos]]+=num; return; } pos++; if (pos==sz) pos=0; } dp[c][++tot[c]]=num; hs[pos]=tot[c]; sta[c][tot[c]]=s; } void DP(){ for (int i=1;i<=n;i++){ for (int k=1;k<=tot[c];k++) sta[c][k]<<=2; for (int j=1;j<=m;j++){ c^=1; tot[c]=0; memset(hs,-1,sizeof(hs)); for (int k=1;k<=tot[c^1];k++){ int s=sta[c^1][k]; ll num=dp[c^1][k]; int p=(s>>bit[j-1])&3,q=(s>>bit[j])&3; if (!mp[i][j]){ if (!p&&!q) add(s,num); } else if (!p&&!q){ if (!mp[i+1][j]||!mp[i][j+1]) continue; s+=(1<<bit[j-1])+(1<<(bit[j]+1)) ; add(s,num); } else if (!p&&q){ if (mp[i][j+1]) add(s,num); if (mp[i+1][j]){ s+=(1<<bit[j-1])*q-(1<<bit[j])*q; add(s,num); } } else if (!q&&p){ if (mp[i+1][j]) add(s,num); if (mp[i][j+1]){ s+=(1<<bit[j])*p-(1<<bit[j-1])*p; add(s,num); } } else if (p+q==2){ int b=1; for (int t=j+1;t<=m;t++){ int v=(s>>bit[t])&3; if (v==1) b++; if (v==2) b--; if (!b){ s-=(1<<bit[t]); break; } } s-=(1<<bit[j-1])+(1<<bit[j]); add(s,num); } else if (p+q==4){ int b=1; for (int t=j-2;t>=0;t--){ int v=(s>>bit[t])&3; if (v==2) b++; if (v==1) b--; if (!b){ s+=(1<<bit[t]); break; } } s-=2*(1<<bit[j-1])+2*(1<<bit[j]); add(s,num); } else if (p==2&&q==1){ s-=(1<<(bit[j-1]+1))+(1<<bit[j]); add(s,num); } else if (p==1&&q==2){ if (i==ex&&j==ey) ans+=num; } } } } } int main(){ for (int i=0;i<=25;i++) bit[i]=i<<1; scanf("%d%d",&n,&m); tot[0]=1; dp[c][1]=1; for (int i=1;i<=n;i++){ scanf("%s",s+1); for (int j=1;j<=m;j++) if (s[j]=='.') mp[i][j]=1,ex=i,ey=j; } DP(); printf("%lld\n",ans); }
相关文章推荐
- 【BZOJ1814】Ural 1519 Formula 1 插头DP
- 【bzoj1814】Ural 1519 Formula 1 插头dp
- [BZOJ]1814 Ural 1519 Formula 1 插头DP
- bzoj 1814: Ural 1519 Formula 1 插头dp经典题
- bzoj1814: Ural 1519 Formula 1 2011-12-20
- bzoj1814 Ural 1519 Formula 1(插头dp模板题)
- 1814: Ural 1519 Formula 1
- Ural 1519 Formula 1
- ural 1519 Formula 1
- 【Ural1519】Formula 1 插头DP模板
- [省选前题目整理][URAL 1519]Formula 1(插头DP)
- [URAL1519]-Formula 1-插头DP
- URAL 1519 Formula 1
- URAL1519:Formula 1——题解
- URAL - 1519 :Formula 1
- URAL 1519 Formula 1 【插头DP模板题】
- [ural1519]Formula 1 && 插头DP
- URAL 1519 Formula 1 dp(插头)
- Ural1519 Formula 1
- ural1519 Formula 1