数位DP-UESTC

来源:互联网 发布:windows phone 知乎 编辑:程序博客网 时间:2024/06/05 09:55

windy数就是没有前缀0并且相邻之间数的绝对值大于等于2
重点就是对前缀0的处理。感觉写的挺好。
默认 数位dp在计算时前面是有一大群0的,比如 1就是 00001
(看初始位数),如果不去掉是没法计算这个数的。

.

#include <iostream>#include <cstdio>#include <cstdlib>#include <cstring>/*实现的两个方法1 用状态数组,一个一个加。2 用一个 辅助的数组,储存个数。*/int bit[12];int m,n;int dp[12][10];using namespace std;int dfs(int len,int  pre,bool limit,bool first){  if(len<0) return 1;   if(!limit&&!first&&dp[len][pre]!=-1) return dp[len][pre];   int u=limit?bit[len]:9;   int res=0;   for(int i=0;i<=u;i++)   {  if(first||(!first&&abs(pre-i)>=2))       res+=dfs(len-1,i,limit&&i==u,first&&i==0);   }    if(!limit&&!first) dp[len][pre]=res;    return res;}int solve (int c){   int len=0;  memset(bit,0,sizeof(bit));  memset(dp,-1,sizeof(dp));   while(c)   {  bit[len++]=c%10;      c/=10;   }   //cout<<len<<endl;   int all=dfs(len-1,0,true,true);//新来一个数,判断是否有0;    return all;}int main(){       while(~scanf("%d%d",&m,&n))    //memset(dp,-1,sizeof(dp));     {  memset(bit,0,sizeof(bit));         printf("%d\n",solve(n)-solve(m-1));     }    return 0;}
0 0