数位dp

来源:互联网 发布:mac 解压rar文件命令 编辑:程序博客网 时间:2024/06/05 02:29

1. windy数。

题意:求给定区间范围内的,求相邻数位之差绝对值不小于2的数的个数。

题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1026

code:

#include<string.h>#include<stdio.h>#include<iostream>using namespace std;const int maxn = 12;int f[maxn][10];int d[maxn];bool check(int x, int y) {    return x - y >= 2 || y - x >= 2;}void init() {    memset(f, 0, sizeof(f));    for(int i = 0; i < 10; i++) f[1][i] = 1;    for(int i = 2; i < maxn; i++) {        for(int j = 0; j < 10; j++) {            for(int k = 0; k < 10; k++) {                if(j == 0 || check(j, k)) f[i][j] += f[i-1][k];            }        }    }}int solve(int x) {    int m = 0;    if(x == 0) m = 1;    memset(d, 0, sizeof(d));    while(x) {        d[m++] = x % 10;        x /= 10;    }    int ans = 0;    for(int i = m - 1; i >= 0; i--) {        for(int j = 0; j < d[i]; j++) {            if(i == m - 1 || check(d[i+1], j)) ans += f[i+1][j];        }        if(i != m - 1 && !check(d[i], d[i+1])) break;        if(!i) ans++;    }    return ans;}int main() {    int a, b;    init();    while(~scanf("%d%d", &a, &b)) {        printf("%d\n", solve(b) - solve(a-1));    }}
2. Investigating Div-Sum Property (UVA 11361)
#include<stdio.h>#include<string.h>const int maxn = 10;const int maxk = 90;int P[maxn];int f[maxn][maxk][maxk];int d[maxn];int A, B, K;void init() {    P[0] = 1;    for(int i = 1; i < maxn; i++) P[i] = P[i-1] * 10;}void calc() {    memset(f, 0, sizeof(f));    f[0][0][0] = 1;    for(int t = 1; t < maxn; t++) {        for(int a = 0; a < maxk; a++) {            for(int b = 0; b < maxk; b++) {                for(int c = 0; c < 10; c++) {                    int ta = (a + c * P[t-1]) % K;                    int tb = (b + c) % K;                    f[t][ta][tb] += f[t-1][a][b];                }            }        }    }}int solve(int x) {    if(x == 0) return 1;    memset(d, 0, sizeof(d));    int m = 0;    while(x) {        d[m++] = x % 10;        x /= 10;    }    int ans = 0;    int pExp, pSum;    pExp = pSum = 0;    for(int i = m - 1; i >= 0; i--) {        for(int j = 0; j < d[i]; j++) {            int a = (K - (pExp + j * P[i]) % K) % K;            int b = (K - (pSum + j) % K ) % K;            ans += f[i][a][b];        }        pExp = (pExp + P[i] * d[i]) % K;        pSum = (pSum + d[i]) % K;        if(i == 0 && pExp == 0 && pSum == 0) ans++;    }    return ans;}int main() {    init();    int kase;    scanf("%d", &kase);    while(kase--) {        scanf("%d%d%d", &A, &B, &K);        int ans = 0;        if(K < maxk) {            calc();            ans = solve(B) - solve(A-1);        }        printf("%d\n", ans);    }    return 0;}




0 0
原创粉丝点击