详细来说就是因为前面的前导 0 不应该比较相互之间是否差大于 2,所以 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;
}