题目:windy数
思路:数位dp
代码:
#include<bits/stdc++.h>
using namespace std;
#define read(x) scanf("%d",&x)
int L,R;
int a[20];
int f[20][20][2];
int dp(int x,int fa,int lmt) {
if(x==0) return 1;
if(fa!=-1&&f[x][fa][lmt]!=-1) return f[x][fa][lmt];
int up=9;
if(lmt) up=a[x];
int ans=0;
for(int i=0;i<=up;i++) {
if(fa!=-1&&abs(i-fa)<2) continue;
ans+=dp(x-1,(i==0&&fa==-1)?-1:i,lmt&&i==up);
}
if(fa!=-1) f[x][fa][lmt]=ans;
return ans;
}
int slv(int x) {
memset(f,-1,sizeof(f));
int len=0;
while(x) {
a[++len]=x%10;
x/=10;
}
return dp(len,-1,1);
}
int main() {
read(L),read(R);
printf("%d",slv(R)-slv(L-1));
return 0;
}

本文深入探讨了Windy数的概念及其求解策略,通过数位DP算法实现,详细介绍了算法的核心思想和具体实现代码。适用于解决特定数字序列问题,为理解复杂数位动态规划提供了一个实例。
814

被折叠的 条评论
为什么被折叠?



