1. 程式人生 > >bzoj 1026 [SCOI2009]windy數——數位dp水題

bzoj 1026 [SCOI2009]windy數——數位dp水題

https zoj target ios tdi end () targe !=

題目:https://www.lydsy.com/JudgeOnline/problem.php?id=1026

迷戀上用dfs寫數位dp了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=15;
int l,r,dg[N],dp[N][N];
int dfs(int p,int lst,bool fr,bool fx)
{
    if(!p)return 1;
    if(!fx&&dp[p][lst]!=-1
)return dp[p][lst]; int st=(fr?1:0),end=(fx?dg[p]:9); int ret=0; for(int i=st;i<=end;i++) if(fr||(abs(i-lst)>=2)) ret+=dfs(p-1,i,0,fx&(i==dg[p])); if(!fx)dp[p][lst]=ret; return ret; } int calc(int x) { int cnt=0,ret=0; while(x)dg[++cnt]=x%10,x/=10;
for(int i=1;i<=cnt;i++) { memset(dp,-1,sizeof dp);//寫在這裏 ret+=dfs(i,0,1,(i==cnt)); } return ret; } int main() { scanf("%d%d",&l,&r); printf("%d\n",calc(r)-calc(l-1)); return 0; }

bzoj 1026 [SCOI2009]windy數——數位dp水題