【HDOJ】3652 B-number
终于自己写出来一道数位DP啊。继续训练DP。
1 /* 3652 */ 2 #include <iostream> 3 #include <sstream> 4 #include <string> 5 #include <map> 6 #include <queue> 7 #include <set> 8 #include <stack> 9 #include <vector> 10 #include <deque> 11 #include <algorithm> 12 #include <cstdio> 13 #include <cmath> 14 #include <ctime> 15 #include <cstring> 16 #include <climits> 17 #include <cctype> 18 #include <cassert> 19 #include <functional> 20 #include <iterator> 21 #include <iomanip> 22 using namespace std; 23 //#pragma comment(linker,"/STACK:102400000,1024000") 24 25 #define sti set<int> 26 #define stpii set<pair<int, int> > 27 #define mpii map<int,int> 28 #define vi vector<int> 29 #define pii pair<int,int> 30 #define vpii vector<pair<int,int> > 31 #define rep(i, a, n) for (int i=a;i<n;++i) 32 #define per(i, a, n) for (int i=n-1;i>=a;--i) 33 #define clr clear 34 #define pb push_back 35 #define mp make_pair 36 #define fir first 37 #define sec second 38 #define all(x) (x).begin(),(x).end() 39 #define SZ(x) ((int)(x).size()) 40 #define lson l, mid, rt<<1 41 #define rson mid+1, r, rt<<1|1 42 43 const int maxl = 12; 44 int dp[maxl][2][13][3]; 45 char s[15]; 46 47 void solve() { 48 int len = strlen(s); 49 50 rep(i, 0, len) 51 s[i] -= '0'; 52 53 memset(dp, 0, sizeof(dp)); 54 dp[0][0][0][0] = 1; 55 56 rep(i, 0, len) { 57 rep(j, 0, 13) { 58 rep(k, 0, 3) { 59 if (!dp[i][0][j][k]) 60 continue; 61 int dtmp = (i==0) ? s[i]+1:10; 62 rep(d, 0, dtmp) { 63 int jj = (j*10 + d)%13; 64 int kk = 0; 65 int p = 0; 66 67 if (k == 2) { 68 kk = 2; 69 } else if (k == 1) { 70 if (d == 3) { 71 kk = 2; 72 } else if (d == 1) { 73 kk = 1; 74 } 75 } else { 76 if (d == 1) { 77 kk = 1; 78 } 79 } 80 81 if (i==0 && d==s[i]) 82 p = 1; 83 84 dp[i+1][p][jj][kk] += dp[i][0][j][k]; 85 } 86 } 87 } 88 89 rep(j, 0, 13) { 90 rep(k, 0, 3) { 91 if (!dp[i][1][j][k]) 92 continue; 93 rep(d, 0, s[i]+1) { 94 int jj = (j*10 + d)%13; 95 int kk = 0; 96 int p = 0; 97 98 if (k == 2) { 99 kk = 2; 100 } else if (k == 1) { 101 if (d == 3) { 102 kk = 2; 103 } else if (d == 1) { 104 kk = 1; 105 } 106 } else { 107 if (d == 1) { 108 kk = 1; 109 } 110 } 111 112 if (d == s[i]) 113 p = 1; 114 115 dp[i+1][p][jj][kk] += dp[i][1][j][k]; 116 } 117 } 118 } 119 } 120 121 int ans = dp[len][0][0][2]; 122 printf("%d\n", ans); 123 } 124 125 int main() { 126 ios::sync_with_stdio(false); 127 #ifndef ONLINE_JUDGE 128 freopen("data.in", "r", stdin); 129 freopen("data.out", "w", stdout); 130 #endif 131 132 int x; 133 134 while (scanf("%d", &x)!=EOF) { 135 ++x; 136 sprintf(s, "%d", x); 137 solve(); 138 } 139 140 #ifndef ONLINE_JUDGE 141 printf("time = %d.\n", (int)clock()); 142 #endif 143 144 return 0; 145 }