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