UESTC 1307 windy数(数位DP)

题目链接

这其实入门题,不过,我写了好一会,还是一直wa,图样。。。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <queue>
 5 #include <map>
 6 #include <ctime>
 7 #include<sstream>
 8 #include <cmath>
 9 #include <algorithm>
10 using namespace std;
11 int dp[11][11],sum[11];
12 int judge(int x)
13 {
14     int num[11],i,j,n = 0,pre;
15     int ans = 0;
16     if(x == 0)
17     return 1;
18     while(x)
19     {
20         num[n++] = x%10;
21         x /= 10;
22     }
23     if(n == 1)
24     {
25         return num[0] + 1;
26     }
27     for(i = 1;i < n;i ++)
28     {
29         for(j = 1;j < 10;j ++)
30         ans += dp[i][j];
31     }
32     ans ++;
33     for(i = 1;i < num[n-1];i ++)
34     {
35         ans += dp[n][i];
36     }
37     pre = num[n-1];
38     for(i = n-2; i >= 0; i --)
39     {
40         if(i == 0)
41         {
42             for(j = 0; j <= num[i]; j ++)
43             {
44                 if(max(j,pre)-min(j,pre) >= 2)
45                 ans ++;
46             }
47             break;
48         }
49         for(j = 0; j < num[i]; j ++)
50         {
51             if(max(j,pre)-min(j,pre) >= 2)
52             {
53                 ans += dp[i+1][j];
54             }
55         }
56         if(max(num[i],pre)-min(num[i],pre) < 2) break;
57         pre = num[i];
58     }
59     return ans;
60 }
61 
62 int main()
63 {
64     int i,j,k,x,y;
65     for(i = 0; i < 10; i ++)
66         dp[1][i] = 1;
67     for(i = 2; i <= 10; i ++)
68     {
69         for(j = 0; j < 10; j ++)
70         {
71             for(k = 0; k < 10; k ++)
72             {
73                 if(max(j,k)-min(j,k) >= 2)
74                 {
75                     dp[i][j] += dp[i-1][k];
76                 }
77             }
78         }
79     }
80     while(scanf("%d%d",&x,&y)!=EOF)
81     {
82         printf("%d\n",judge(y)-judge(x-1));
83     }
84     return 0;
85 }
86                      

 

posted @ 2013-09-17 08:54  Naix_x  阅读(196)  评论(0编辑  收藏  举报