开坑数位dp

【背景】

在10月3日的dp专练中,压轴的第6题是一道数位dp,于是各种懵逼。

为了填上这个留存已久的坑,蒟蒻chty只能开坑数位dp了。

【例题一】[HDU2089]不要62

题目大意:给你一个区间[l,r],求区间内不含4和62的数的个数。

分析:首先  ans[l,r]=ans[0,r]-ans[0,l-1],这样成功将问题转化为了求区间[0,x]的答案,然后减一下即可。

   然后可以预处理出一个f[][]数组,f[i][j]表示表示在i位数中以j开头的满足条件的数的个数,那么显然f[i][j]=sum{f[i-1][k]} (0<=k<=9&&j!=4&&!(j==6&&k==2))  

   然后用一个digit[]数组记录当前x从高位到低位的数字,如x=529,则digit[1]=5,digit[2]=2,digit[3]=9

   最后从高到低按位累加答案即可。(这点不明白的可以看我的代码,毕竟有些东西只能意会,无法言传)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<algorithm>
 6 #include<cmath>
 7 #include<ctime>
 8 using namespace std;
 9 int n,m,digit[10],f[10][10];
10 inline int read()
11 {
12     int x=0,f=1;  char ch=getchar();
13     while(!isdigit(ch))  {if(ch=='-')  f=-1;  ch=getchar();}
14     while(isdigit(ch))  {x=x*10+ch-'0';  ch=getchar();}
15     return x*f;
16 }
17 void pre()
18 {
19     memset(f,0,sizeof(f));
20     f[0][0]=1;
21     for(int i=1;i<=9;i++)
22         for(int j=0;j<=9;j++)
23             for(int k=0;k<=9;k++)
24                 if(j!=4&&!(j==6&&k==2))
25                     f[i][j]+=f[i-1][k];
26 }
27 int ask(int x)
28 {
29     int len=0,ans=0;
30     while(x){digit[++len]=x%10;x/=10;}
31     digit[len+1]=0;
32     for(int i=len;i;i--)
33     {
34         for(int j=0;j<digit[i];j++)  if(j!=4&&!(j==2&&digit[i+1]==6))  ans+=f[i][j];
35         if(digit[i]==4||(digit[i]==2&&digit[i+1]==6))  break;
36     }
37     return ans;
38 }
39 int main()
40 {
41     //freopen("cin.in","r",stdin);
42     //freopen("cout.out","w",stdout);
43     pre();
44     while(1)
45     {
46         n=read();  m=read();
47         if(n==0&&m==0)  break;
48         printf("%d\n",ask(m+1)-ask(n));
49     }
50     return 0;
51 }
View Code

 【练习一】[bzoj1026]windy数

题目描述:windy定义了一种windy数。不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。 windy想知道,在A和B之间,包括A和B,总共有多少个windy数?

建议这题自己想做法,其实和上面那道题差不多了。

如果你真的wa到受不了,参考代码:http://www.cnblogs.com/chty/p/5981569.html

 【练习二】[hdu3555]bomb

题目大意:求给定区间的含有49的数的个数。

分析:我们可以转换一下思维,先求出区间内不含49的数的个数,然后用n减去这个数就行了,这就转化为了练习一的方法。(与网上其他题解不太一样,个人认为这种做法更简单)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstdlib>
 4 #include<cstring>
 5 #include<cmath>
 6 #include<ctime>
 7 #include<algorithm>
 8 using namespace std;
 9 typedef long long ll;
10 ll T,digit[20],f[20][10];
11 inline ll read()
12 {
13     ll x=0,f=1;  char ch=getchar();
14     while(!isdigit(ch))  {if(ch=='-')  f=-1;  ch=getchar();}
15     while(isdigit(ch))  {x=x*10+ch-'0';  ch=getchar();}
16     return x*f;
17 }
18 void pre()
19 {
20     f[0][0]=1;
21     for(ll i=1;i<=19;i++)
22         for(ll j=0;j<=9;j++)
23             for(ll k=0;k<=9;k++)
24                 if(!(j==4&&k==9))  f[i][j]+=f[i-1][k];
25 }
26 ll ask(ll x)
27 {
28     ll len=0,ans=0;
29     while(x) {digit[++len]=x%10; x/=10;}
30     digit[len+1]=0;
31     for(ll i=1;i<len;i++)
32         for(ll j=1;j<=9;j++)
33             ans+=f[i][j];
34     for(ll i=1;i<digit[len];i++)  ans+=f[len][i];    
35     for(ll i=len-1;i;i--)
36     {
37         for(ll j=0;j<digit[i];j++)  if(!(digit[i+1]==4&&j==9))  ans+=f[i][j];
38         if(digit[i+1]==4&&digit[i]==9)  break;
39     }
40     return ans;
41 }
42 int main()
43 {
44     //freopen("cin.in","r",stdin);
45     //freopen("cout.out","w",stdout);
46     T=read();  pre();
47     while(T--){ll n=read();printf("%I64d\n",n-ask(n+1));}
48     return 0;
49 }
View Code

 

 

 

【例题二】[poj3208]Apocalypse Someday

描述 Description
探险队员终于进入了金字塔。通过对古文字的解读, 他们发现,和《圣经》的作者想的一样,古代人认为 666 是属于魔鬼的数。不但如此,只要某数字的十进制表示中 有三个连续的 6,古代人也认为这个是魔鬼的数,比如 666,
1 666, 2 666, 3 666, 6 663, 16 666, 6 660 666 等等,统统是魔 鬼的数。
古代典籍经常用“第 X 大的魔鬼的数”来指代这些数。 这给研究人员带来了极大的不便。为了帮助他们,你需要写一个程序来求出这些魔鬼的数字。

题解详见http://blog.csdn.net/popoqqq/article/details/39319021

用上述方法写这道题的代码如下:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 #include<cmath>
 6 #include<ctime>
 7 #include<algorithm>
 8 using namespace std;
 9 typedef long long ll;
10 ll T,S,f[30][5],digit[30];
11 inline ll read()
12 {
13     ll x=0,f=1;  char ch=getchar();
14     while(!isdigit(ch))  {if(ch=='-')  f=-1;  ch=getchar();}
15     while(isdigit(ch))  {x=x*10+ch-'0';  ch=getchar();}
16     return x*f;
17 }
18 void pre()
19 {
20     f[0][0]=1;
21     for(ll i=1;i<=29;i++)
22     {
23         f[i][0]=(f[i-1][0]+f[i-1][1]+f[i-1][2])*9;
24         f[i][1]=f[i-1][0];
25         f[i][2]=f[i-1][1];
26         f[i][3]=f[i-1][2]+f[i-1][3]*10;
27     }
28 }
29 int getans(ll x)
30 {
31     ll len=0,ans=0,cnt=0;
32     while(x)  {digit[++len]=x%10;  x/=10;}
33     for(ll i=len,j;i;i--)
34     {
35         ll sum;
36         for(int j=1;j<=digit[i];j++)
37         {
38             if(cnt==3)  sum=3;
39             else if(j==7)  sum=cnt+1;
40             else sum=0;
41             for(ll k=3;k>=3-sum;k--)  ans+=f[i-1][k];
42         }
43         if(cnt!=3)  cnt=(digit[i]==6?cnt+1:0);
44     }
45     return ans;
46 }
47 int main()
48 {
49     //freopen("cin.in","r",stdin);
50     //freopen("cout.out","w",stdout);
51     T=read();  pre();
52     while(T--) 
53     {
54         ll S=read(),l=0,r=100000000000ll;
55         while(l+1<r)
56         {
57             ll mid=(l+r)/2;
58             if(getans(mid+1)>=S)  r=mid;
59             else l=mid;
60         }
61         if(getans(r)==S)  printf("%I64d\n",l);
62         else printf("%I64d\n",r);
63     }
64     return 0;
65 }
View Code

 

转载于:https://www.cnblogs.com/chty/p/5980637.html

以下是对提供的参考资料的总结,按照要求结构化多个要点分条输出: 4G/5G无线网络优化与网规案例分析: NSA站点下终端掉4G问题:部分用户反馈NSA终端频繁掉4G,主要因终端主动发起SCGfail导致。分析显示,在信号较好的环境下,终端可能因节能、过热保护等原因主动释放连接。解决方案建议终端侧进行分析处理,尝试关闭节电开关等。 RSSI算法识别天馈遮挡:通过计算RSSI平均值及差值识别天馈遮挡,差值大于3dB则认定有遮挡。不同设备分组规则不同,如64T和32T。此方法可有效帮助现场人员识别因环境变化引起的网络问题。 5G 160M组网小区CA不生效:某5G站点开启100M+60M CA功能后,测试发现UE无法正常使用CA功能。问题原因在于CA频点集标识配置错误,修正后测试正常。 5G网络优化与策略: CCE映射方式优化:针对诺基亚站点覆盖农村区域,通过优化CCE资源映射方式(交织、非交织),提升RRC连接建立成功率和无线接通率。非交织方式相比交织方式有显著提升。 5G AAU两扇区组网:与三扇区组网相比,AAU两扇区组网在RSRP、SINR、下载速率和上传速率上表现不同,需根据具体场景选择适合的组网方式。 5G语音解决方案:包括沿用4G语音解决方案、EPS Fallback方案和VoNR方案。不同方案适用于不同的5G组网策略,如NSA和SA,并影响语音连续性和网络覆盖。 4G网络优化与资源利用: 4G室分设备利旧:面对4G网络投资压减与资源需求矛盾,提出利旧多维度调优策略,包括资源整合、统筹调配既有资源,以满足新增需求和提质增效。 宏站RRU设备1托N射灯:针对5G深度覆盖需求,研究使用宏站AAU结合1托N射灯方案,快速便捷地开通5G站点,提升深度覆盖能力。 基站与流程管理: 爱立信LTE基站邻区添加流程:未提供具体内容,但通常涉及邻区规划、参配置、测试验证等步骤,以确保基站间顺畅切换和覆盖连续性。 网络规划与策略: 新高铁跨海大桥覆盖方案试点:虽未提供详细内容,但可推测涉及高铁跨海大桥区域的4G/5G网络覆盖规划,需考虑信号穿透、移动性管理、网络容量等因素。 总结: 提供的参考资料涵盖了4G/5G无线网络优化、网规案例分析、网络优化策略、资源利用、基站管理等多个方面。 通过具体案例分析,展示了无线网络优化中的常见问题及解决方案,如NSA终端掉4G、RSSI识别天馈遮挡、CA不生效等。 强调了5G网络优化与策略的重要性,包括CCE映射方式优化、5G语音解决方案、AAU扇区组网选择等。 提出了4G网络优化与资源利用的策略,如室分设备利旧、宏站RRU设备1托N射灯等。 基站与流程管理方面,提到了爱立信LTE基站邻区添加流程,但未给出具体细节。 新高铁跨海大桥覆盖方案试点展示了特殊场景下的网络规划需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值