数位DP-UESTC - 250-windy数

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

.

#include 
#include 
#include 
#include 
/*实现的两个方法
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<
   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;
}

你可能感兴趣的:(数位统计dp)