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                      

 

你可能感兴趣的:(dp)