HDU 3886 数位DP

来源:互联网 发布:图片透视软件 编辑:程序博客网 时间:2024/04/30 20:18
#include <cstdio>#include <cstring>#include <algorithm>#include <string>#include <iostream>using namespace std;const int mod = 100000000;string c, s, l, r;int tot;int dp[133][13][133];void add(int &a, int b) {    a += b;    if(a >= mod) a -= mod;}bool ok(char c, int pre, int now) {    if(c == '/') return pre < now;    if(c == '\\') return pre > now;    if(c == '-')return pre == now;    return 0;}int dfs(int len, int pre, int k, bool lim, bool zero) {//    printf("len = %d pre = %d k = %d lim = %d zero = %d\n", len, pre, k, lim, zero);    if(!len) return k == tot;    if(!lim && ~pre && ~dp[len][pre][k]) return dp[len][pre][k];    int m = lim ? (s[len-1]-'0'): 9;    int i;    int ret = 0;    for(i = 0; i <= m; i++) {        if(zero) {            if(!i) add( ret, dfs(len-1,-1,0,lim&&i==m, 1) );            else add( ret, dfs(len-1, i, 0, lim&&i==m, 0) );        }        else {            if(ok(c[k], pre, i) && k < tot)                add( ret, dfs(len-1, i, k+1,i==m&&lim, 0) );            else if(k > 0 && ok(c[k-1], pre, i))                add( ret, dfs(len-1, i, k,i==m&&lim, 0) );        }    }    if(!lim && ~pre) dp[len][pre][k] = ret;    return ret;}int gao(string l) {    s = l;    return dfs(s.size(), -1, 0, 1, 1);}void cut(string &s, bool g) {    int i = 0;    while(i < s.size() && s[i] == '0') i++;    if(i == s.size()) s = "0";    else s = s.substr(i, s.size()-i);    reverse(s.begin(), s.end());    if(g && s != "0") {        s[0]--;        for(i = 0; i < s.size()-1; i++)            if(s[i] < '0') {                s[i] += 10;                s[i+1]--;            }        if(s[0] < '0') s[0] = '0';    }    i = s.size()-1;    while(i >= 0 && s[i] == '0') i--;    if(i == -1) s = "0";    else s = s.substr(0, i+1);    //cout << s << endl;}int main() {    int i, j;    while(cin >> c >> l >> r) {        tot = c.size();        memset(dp, -1, sizeof(dp));        cut(l, 1); cut(r, 0);        printf("%08d\n", ((gao(r)-gao(l))%mod+mod)%mod );    }    return 0;}/*//////\\\1234563333 345345345444*/

原创粉丝点击