萌新刚学数位DP0.1秒,90分求助
查看原帖
萌新刚学数位DP0.1秒,90分求助
306954
芊枫Thomitics楼主2021/4/19 19:01
#include <bits/stdc++.h>
#define INF 999999999

using namespace std;

inline long long read()
{
    long long x = 0;
    int f = 1;
    char ch = getchar();
    while (ch < '0' || ch > '9')
    {
        if (ch == '-')
            f = -1;
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9')
    {
        x = (x << 1) + (x << 3) + (ch ^ 48);
        ch = getchar();
    }
    return x * f;
}
void write(const long long &x)
{
    if (!x)
    {
        putchar('0');
        return;
    }
    char f[100];
    long long tmp = x;
    if (tmp < 0)
    {
        tmp = -tmp;
        putchar('-');
    }
    long long s = 0;
    while (tmp > 0)
    {
        f[s++] = tmp % 10 + '0';
        tmp /= 10;
    }
    while (s > 0)
    {
        putchar(f[--s]);
    }
}

long long totA;
long long totB;
long long DPset[10][11];

void DP()
{
    for (int i = 0; i <= 9; i++)
    {
        DPset[1][i] = 1;
    }
    for (int i = 2; i <= 9; i++)
    {
        for (int j = 0; j <= 9; ++j)
        {
            for (int k = 0; k <= 9; ++k)
            {
                if (abs(j - k) >= 2)
                {
                    DPset[i][j] += DPset[i - 1][k];
                }
            }
        }
    }
}
long long GetSum(int x)
{
    int totANS = 0;
    int length = 1;
    short partedNUM[19] = {0};
    while (x)
    {
        partedNUM[length++] = x % 10;
        x = x / 10;
    }
    length -= 1;
    for (int i = 1; i <= length - 1; ++i)
    {
        for (int j = 1; j <= 9; ++j)
        {
            totANS += DPset[i][j];
        }
    }
    /*
    int Fstn;
    if (x < 10)
    {
        Fstn = x;
    }
    else
    {
        Fstn = x / (10 * (length - 1));
    }
    */
    for (int i = 1; i < partedNUM[length]; ++i)
    {
        totANS += DPset[length][i];
    }
    for (int i = length - 1; i >= 1; --i)
    {
        for (int j = 0; j <= partedNUM[i] - 1; ++j)
        {
            if (abs(partedNUM[i + 1] - j) >= 2)
            {
                totANS += DPset[i][j];
            }
        }
        /*
        if (abs(partedNUM[i + 1] - partedNUM[i]) < 2)
        {
            break;
        }
        */
    }
    return totANS;
}

int main()
{
    totA = read();
    totB = read();
    DP();
    write(GetSum(totB + 1) - GetSum(totA));
    return 0;
} //Thomitics Code

错第三个点

提交记录

2021/4/19 19:01
加载中...