luoguP2657 [SCOI2009]windy数

Posted achensy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luoguP2657 [SCOI2009]windy数相关的知识,希望对你有一定的参考价值。

和诸位巨佬不同,蒟蒻如我,只能想到怎么统计不满足windy数条件的数

就是个爆搜

定义c[i][j][k]表示第i位且前一位为j,k表示是否满足条件

技术图片
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e5+5;
 4 int tot,e[20];
 5 long long c[20][20][2]; 
 6 int a,b;
 7 template<class t>void red(t &x)
 8 
 9     int w=1;
10     x=0;
11     char ch=getchar();
12     while(ch>9||ch<0)
13     
14         if(ch==-)
15             w=-1;
16         ch=getchar(); 
17     
18     while(ch>=0&&ch<=9)
19     
20         x=(x<<3)+(x<<1)+ch-0;
21         ch=getchar();
22      
23     x*=w;
24  
25 void input()
26 
27     freopen("input.txt","r",stdin);
28 
29 void dv(int x)
30 
31     tot=0;
32     while(x)
33     
34         e[++tot]=x%10;
35         x/=10;
36     
37     e[tot+1]=0;
38 
39 long long dfs(int pos,bool limit,bool zero,bool dc,int pre)
40 
41     if(pos==0)
42         return dc;
43     if(!limit&&c[pos][pre][dc]!=-1)
44         return c[pos][pre][dc];
45     int up=limit?e[pos]:9;
46     long long ans=0;
47     for(int i=0;i<=up;++i)
48         ans+=dfs(pos-1,limit&&(i==up),zero||i,dc||(abs(i-pre)<2&&zero),i);
49     if(!limit&&zero)
50         c[pos][pre][dc]=ans;
51     return ans;
52 
53 long long solve(int x)
54 
55     dv(x);
56     memset(c,-1,sizeof(c));
57     return dfs(tot,1,0,0,-1);
58 
59 void read()
60 
61     red(a);
62     red(b);
63 
64 void work()
65 
66     printf("%lld",b-a+1-solve(b)+solve(a-1));
67 
68 int main()
69 
70     input();
71     read();
72     work();
73     return 0;
74 
View Code

 

以上是关于luoguP2657 [SCOI2009]windy数的主要内容,如果未能解决你的问题,请参考以下文章

luogu P2657 [SCOI2009]windy数 数位dp 记忆化搜索

P2657 [SCOI2009]windy数

P2657 [SCOI2009]windy数

P2657 [SCOI2009] windy 数

P2657 [SCOI2009]windy数

P2657 [SCOI2009]windy数 (数位DP)