不会处理因前导0带来的错误,求调
查看原帖
不会处理因前导0带来的错误,求调
989034
MMXIandCCXXII楼主2024/1/26 17:10

详细来说就是因为前面的前导 00 不应该比较相互之间是否差大于 22,所以 dp 是错误的,但不知道怎么改。

代码如下

#include <bits/stdc++.h>
#define int long long
using namespace std;

int f[12][10];
void init()
{
    for (int i = 0; i <= 9; i++) f[1][i] = 1;
    for (int i = 2; i <= 11; i++)
        for (int j = 0; j <= 9; j++)
            for (int k = 0; k <= 9; k++)
                if (abs (j - k) >= 2)
                    f[i][j] += f[i - 1][k];
}

int dp(int x)
{
    if (x == 0) return 1;
    vector <int> v;
    int last = -2, ans = 0;
    while (x) v.push_back (x % 10), x /= 10;
    for (int i = v.size () - 1; i >= 0; i--)
    {
        for (int j = 0; j < v[i]; j++)
            if (abs (j - last) >= 2)
                ans += f[i + 1][j];
        if (abs (last - v[i]) < 2) break;
        last = v[i];
        if (!i) ans++;
    }
    return ans;
}

signed main()
{
    init ();
    for (int i = 1; i <= 11; i++)
    {
        for (int j = 0; j <= 9; j++)
        {
            cout << f[i][j] << " ";
        }
        cout << endl;
    }
    int l, r;
    cin >> l >> r;
    cout << dp (r) - dp (l - 1) << endl;
    return 0;
}
2024/1/26 17:10
加载中...