代码如下
// Problem:
// P2657 [SCOI2009] windy 数
//
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P2657
// Memory Limit: 125 MB
// Time Limit: 1000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=12;
int a[N];
int f[N][10];
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<=9;++j){
for(int k=0;k<=9;++k){
if(abs(k-j)>=2) f[i][j]+=f[i-1][k];
}
}
}
}
int dp(int x)
{
if(!x) return 0;
int cnt=0;
while(x) a[++cnt]=x%10,x/=10;
int res=0,last=-2;
for(int i=cnt;i>=1;--i){
int now=a[i];
for(int j=(i==cnt);j<now;++j){
if(abs(j-last)>=2) res+=f[i][j];
}
if(abs(now-last)<2) break;
last=now;
if(i==1) res++;
}
for(int i=1;i<cnt;++i){
for(int j=1;j<=9;++j){
res+=f[i][j];
}
}
return res;
}
int main()
{
init();
int l,r;
cin>>l>>r;
cout<<dp(r)-dp(l-1);
return 0;
}
我的问题在于 1:为什么int dp()中不能直接从0开始枚举 反而要在后面算cnt-1位的和?我修改了一下发现输出是错的 2.为什么后面算cnt-1位的时候,不能直接for(int j=0;j<=9;++j){ans+=f[cnt-1][j]} 直接从0位加起,不就不用后面的了?我修改了一下发现这个输入也是错的。
话说,这两个感觉是一个问题(