P2657 [SCOI2009] windy 数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
AC代码:
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int N = 15;
int nums[N];
ll f[N][N];
ll dfs(int pos, int last, bool lead, bool limit)
{
if (pos == 0)return 1;
//__ __ __
ll res = 0;
if (!limit && !lead && f[pos][last] != -1)return f[pos][last];
int up = (limit ? nums[pos] : 9);
for (int i = 0; i <= up; i++)
{
if (abs(i - last) < 2)continue;
if (i == 0 && lead)
res += dfs(pos - 1, -2, true, limit && i == up);
else res += dfs(pos - 1, i, false, limit && i == up);
}
if (!lead && !limit)f[pos][last] = res;
return res;
}
ll solve(ll x)
{
memset(f, -1, sizeof f);
int len = 0;
while (x)
{
nums[++len] = x % 10;
x /= 10;
}
return dfs(len, -2, true, true);
}
int main()
{
ll a, b;
cin >> a >> b;
cout << solve(b) - solve(a - 1);
return 0;
}
相关解释:
这里dfs的参数要存一下当前位的前一位的值,即last,因为刚开始0也是windy数,所以last的初始值应该为-2。最后套一下模板就可以了。