每日AC

许诺  •  21天前


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

int dp[20][10][2][2];
string num;

int dfs(int pos, int prev, bool leading, bool tight) {
	if (pos == num.size()) {
    	return 1;
	}
	if (dp[pos][prev][leading][tight] != -1) {
    	return dp[pos][prev][leading][tight];
	}
	int limit = tight ? num[pos] - '0' : 9;
	int ans = 0;
	for (int i = 0; i <= limit; ++i) {
    	if (leading && i == 0) {
        	ans += dfs(pos + 1, i, true, tight && (i == limit));
    	} else {
        	if (abs(i - prev) >= 2 || leading) {
            	ans += dfs(pos + 1, i, false, tight && (i == limit));
        	}
    	}
	}
	return dp[pos][prev][leading][tight] = ans;
}

int countWindy(int x) {
	num = to_string(x);
memset(dp, -1, sizeof(dp));
	return dfs(0, 0, true, true);
}

int main() {
	int A, B;
	cin >> A >> B;
	int ans = countWindy(B) - countWindy(A - 1);
	cout << ans << endl;
	return 0;
}

评论:

请先登录,才能进行评论