洛谷 P2657 [SCOI2009] windy 数
数位DP模板题
#include<bits/stdc++.h>
using namespace std;
const int N = 20;
int a[N];
int f[N][10];
inline int read() {
int ans = 0, f = 1;
char ch = getchar();
while (ch < '0' || ch > '9') {
if (ch == '-')f = -1;
ch = getchar();
}
while (ch <= '9' && ch >= '0') {
ans = ans * 10 + ch - '0';
ch = getchar();
}
return ans * f;
}
void init() {
for (int i = 0; i<= 9 ; i++) {
f[1][i] = 1;
}
for (int i = 2; i< N; i++) {
for (int j = 0; j< 10; j++) {
for (int k= 0; k<10; k++) {
if (abs(k-j)>=2)
f[i][j] += f[i-1][k];
}
}
}
}
int dp(int x) {
int cnt =0;
while(x) {
a[++cnt] = x%10;
x/=10;
}
int ans = 0;
int last = -2;
for (int i = cnt; i>0; i--) {
int cur = a[i];
for (int j = i==cnt;j<cur;j++) {
if (abs(j-last) >=2)
ans += f[i][j];
}
if (abs(last - cur) <2)
break;
last = cur;
if (i==1)
ans++;
}
for (int i = 1; i< cnt; i++) {
for (int j =1; j<10; j++) {
ans += f[i][j];
}
}
return ans;
}
int main() {
init();
int x= read(),y =read();
cout<<dp(y)-dp(x-1);
return 0;
}

浙公网安备 33010602011771号