数位dp--Windy数
创始人
2024-05-31 14:27:36
0

题目
在这里插入图片描述
思路
大体思路其实也跟第一篇博客类似,用前缀和的思想处理区间的方案数,然后求方案数则是通过把每一位数都拆分来,然后根据两种选择0-an-1和选an两种情况进行判断,但是因为前导零会对结果产生不一样的结果(比如0013本来是一个可以的方案但是因为0和1不满足条件如果不做特判这种情况会被划掉

那我们就从含有前导零和不含有前导零开始看

含有前导零
如果是含有前导零的情况,那么前n位数一定都是0,那么对于一共有n位数,并且第一位是零的情况,第2位的选择可以为0123456789之中的任意一个,那么我们可以对于所有的前导零的情况,不断的加上方案数,这样就可以直接把含有前导零的情况直接计算出来。

关于方案数的处理

根据上面的情况来看我们发现我们要处理的方案是最高位数是i并且一共有n位数字的方案数,
其实也跟第二篇博客的不降数很像,只不过在选择的限制条件有所不同。对于最高位数是i并且一共有n位数字那么就相当于最高位数是j (abs(j+2)>=2),并且一共有n-1位数的情况之和,这样方程就列出来了,可以直接先预处理所有的方案数啦!

然后是不含有前导零的部分
对于不含有前导零的部分,那么其实就是直接计算就可以了(但是要记得第一位不能为0,这样会产生前导零),记last为前一位选择的数字(初始化的数字为3因为第一位可以选择1到an-1 之间任意的数字,那么就需要构造一个满足条件的last即可) 如果是走左半部分,那么就是从0开始,加上满足条件的方案数:如果是走右半部分,那么就判断一下last和an的绝对值是否大于等于2,如果不满足则不能选择这个数字直接break:对于最后的右子树,如果可以走到,就说明这种方案数是可以满足的,那么直接res++即可。(详细操作直接看代码)

在这里插入图片描述

**代码 **

#include
#include
#include
#include
using namespace std;const int N=30;
int dp[N][N];void cal()
{for(int i =0;i<=9;i++)dp[1][i]=1;//一共有1位并且上一位是i的方案数量for(int i =2;i<=N;i++)for(int j =0;j<=9;j++){for(int k=0;k<=9;k++)if(abs(j-k)>=2)dp[i][j]+=dp[i-1][k];}
}int DP(int n){if(!n)return 0;//0不是正整数vectorcnt;while(n)cnt.push_back(n%10),n/=10;int res=0;int last=-3;//上一位的数,因为第一位计算的时候不能包含前导零,那么令last为-3保证所有数都可以满足条件//计算包含前导零的情况for(int i=cnt.size()-1 ; i >=0  ; i--){int x=cnt[i];        for(int j = (i==cnt.size()-1); j=2) res += dp[i+1][j];//一共有i+1位数字if(abs(last-x)<2)break;//如果当前的数跟上一位的数冲突last=x;if(!i)res++;}//计算不包含前导零的情况for(int i =cnt.size()-1;i>=1;i--)for(int j =1;j<=9;j++)res+=dp[i][j];return res;
}
int main()
{int l,r;cal();cin>>l>>r;cout<

ps:是第三篇数位dp的题解,因为和前面的题解的大体思路都很相似,如果看不懂的可以看一下前两篇的题解,有问题也欢迎随时来问!

相关内容

热门资讯

官方通报疑医生暴力接生致婴儿残... 转自:北京时间 【#官方通报疑医生暴力接生致婴儿残疾#】...
华泰人寿高层大“换血” 记者丨林汉垚编辑丨肖嘉7月10日,华泰人寿保险股份有限公司(以下简称“华泰人寿”)任命牛增亮为公司总...
三地三代科研人接力种出新滋味   7月的河北沽源,千亩生菜迎来采收高峰,从田间直供全国肯德基餐厅。与此同时,一筐筐新鲜蔬菜在鲜切菜...
巨轮智能涨2.41%,成交额5... 7月11日,巨轮智能盘中上涨2.41%,截至13:46,报8.08元/股,成交5.26亿元,换手率3...
井松智能涨2.14%,成交额2... 7月11日,井松智能盘中上涨2.14%,截至13:46,报18.58元/股,成交2674.65万元,...
灿瑞科技涨2.02%,成交额2... 7月11日,灿瑞科技盘中上涨2.02%,截至13:47,报32.36元/股,成交2404.54万元,...
寻蓟城觅燕都   ▌谭烈飞 著  北京什么时候从中国北方的军事重镇发展成为都城的呢?公元前的周武王时期,北京地区的...
以太坊基金会发文阐述以太坊全面... 吴说获悉,以太坊基金会博客发布文章,阐述以太坊全面采用零知识证明(ZK),首步为部署 L1 zkEV...
佰维存储涨2.04%,成交额3... 7月11日,佰维存储盘中上涨2.04%,截至13:49,报67.05元/股,成交3.90亿元,换手率...
“杨少华剪彩饭店暂停营业”?平... 来源:中国青年报微信公号7月9日,相声演员杨少华去世,享年94岁。噩耗传出后,多位网友都在社交平台发...