bzoj1026数位dp

基础的数位dp

但是ce了一发,(abs难道不是cmath里的吗?改成bits/stdc++.h就过了)

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int a,b,len;
 4 int dp[100][100],dight[12];
 5 int solve(int x)
 6 {
 7     if (x==0) return 0;
 8     int ans=0;
 9     for(len=0;x>0;x/=10)
10         dight[++len]=x%10;
11     for(int i=1;i<=dight[len]-1;i++)
12         ans+=dp[len][i];
13     for(int i=len-1;i>0;i--)
14         for(int j=1;j<=9;j++)
15             ans+=dp[i][j];
16     for(int i=len-1;i>0;i--)
17     {
18         for(int j=0;j<=dight[i]-1;j++)
19             if (abs(dight[i+1]-j)>=2) ans+=dp[i][j];
20         if(abs(dight[i+1]-dight[i])<2) break;
21     }
22     return ans;
23 }
24 int main()
25 {
26     scanf("%d%d",&a,&b);
27     for(int i=0;i<=9;i++)
28         dp[1][i]=1;
29     for(int i=2;i<=10;i++)
30         for(int j=0;j<=9;j++)
31             for(int k=0;k<=9;k++)
32                  if(abs(j-k)>=2)
33                     dp[i][j]+=dp[i-1][k];
34     printf("%d\n", solve(b+1)-solve(a));
35 }

 

posted @ 2016-09-19 20:24  汪立超  阅读(...)  评论(... 编辑 收藏