bzoj 1026: [SCOI2009]windy数

本文介绍了一道经典的数字动态规划问题的解决方法,通过预处理得到任意长度、任意结尾数字的合法序列数量,进而求出指定范围内满足条件的整数总数。该文详细展示了代码实现过程,并提供了一个完整的C++程序示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

D(不)P(会)类

 1 #include<bits/stdc++.h>
 2 #define N 200005
 3 #define LL long long
 4 #define inf 0x3f3f3f3f
 5 #define ls tr[x][0]
 6 #define rs tr[x][1]
 7 using namespace std;
 8 inline int ra()
 9 {
10     int x=0,f=1; char ch=getchar();
11     while (ch<'0' || ch>'9') {if (ch=='-') f=-1; ch=getchar();}
12     while (ch>='0' && ch<='9') {x=x*10+ch-'0'; ch=getchar();}
13     return x*f;
14 }
15 int f[12][10];
16 int dp[12];
17 void init()
18 {
19     memset(f,0,sizeof(f));
20     for (int i=0; i<10; i++) f[1][i]=1;
21     for (int i=2; i<=10; i++)
22     {
23         for (int j=0; j<10; j++)
24         {
25             for (int k=0; k<10; k++)
26             {
27                 if (abs(j-k)>=2) 
28                     f[i][j]+=f[i-1][k];
29             }
30         }
31     }
32 }
33 int len;
34 int solve(int a)
35 {
36     len=0;
37     while (a)
38     {
39         dp[len++]=a%10;
40         a/=10;
41     } 
42     int ans=0;
43     for (int i=1; i<len; i++)
44         for (int j=1; j<10; j++)
45             ans+=f[i][j];
46     for (int i=1; i<dp[len-1]; i++)
47         ans+=f[len][i];
48     for (int i=len-1; i>=1; i--)
49     {
50         for (int j=0; j<dp[i-1]; j++)
51             if (abs(j-dp[i])>=2)
52                 ans+=f[i][j];
53         if (abs(dp[i]-dp[i-1])<2) break;
54     }
55     return ans;
56 }
57 int main()
58 {
59     init(); int a,b;
60     while (~scanf("%d%d",&a,&b))
61     {
62         cout<<solve(b+1)-solve(a);
63     }
64     return 0;
65 }

 

转载于:https://www.cnblogs.com/ccd2333/p/6482393.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值