数位DP

来源:互联网 发布:水电算量软件 编辑:程序博客网 时间:2024/05/16 09:11

找个机会复习一下。。重新写一边题解。。

HDU 2089

#include <cstdio>#define FOR(i,j,k) for(i=j;i<=k;i++)int dp[16][10];void init() {    int i, j, k;    dp[0][0] = 1;    FOR(i,1,14) FOR(j,0,9) {        dp[i][j]=0;        if (j != 4) FOR(k,0,9) if (j != 6 && k != 2)            dp[i][j] += dp[i - 1][k];    }}int calc(int n) {    static int digit[16];    int l = 0, ans = 0, i, j;    while (n) {        digit[++l] = n % 10;        n /= 10;    }    digit[l + 1] = 0;    for (i = l; i; --i) {        for (j = 0; j < digit[i]; ++j)            if (j != 4 && !(digit[i+1]==6 && j == 2))                ans += dp[i][j];        if (digit[i] == 4 || (digit[i] == 2 && digit[i + 1] == 6))            break;    }    return ans;}int main() {    int i, j;    init();    while(~scanf("%d%d", &i, &j)) {        if(i+j==0)break;        printf("%d\n", calc(j+1)-calc(i));    }    return 0;}

HDU 3555

#include <cstdio>#define FOR(i,j,k) for(i=j;i<=k;i++)typedef unsigned long long ull;ull dp[32][10];void init() {    int i, j, k;    dp[0][0] = 1;    FOR(i,1,25) FOR(j,0,9) {        dp[i][j] = 0;        FOR(k,0,9) if(j != 4 || k != 9)            dp[i][j] += dp[i - 1][k];    }}ull calc(ull n) {    static ull digit[32];    ull l = 0, ans = 0, i, j;    while (n) {        digit[++l] = n % 10;        n /= 10;    }    digit[l+1]=0;    for (i = l; i; --i) {        for (j=0;j<digit[i];j++)            if (!(digit[i + 1] == 4 && j == 9))                ans += dp[i][j];        if (digit[i] == 9 && digit[i + 1] == 4)            break;    }    return ans;}int main() {    ull i; int t;    init();    scanf("%d", &t);    while (t--) {        scanf("%I64u", &i);        printf("%I64u\n", i+1-calc(i+1));    }    return 0;}
0 0
原创粉丝点击