• [Hdu2089]不要62(数位DP)


    Description

    题目大意:给定区间[n,m],求在n到m中没有“62“或“4“的数的个数。

    如62315包含62,88914包含4,这两个数都是不合法的。

    0<n<=m<1000000

    Solution

    数位DP,首先预处理数组(F[i][j]),表示位数为(i),开头为(j)时,满足条件的数的个数

    对于区间([l,r])转化为求([0,r]-[0,l))即可

    对于区间([0,n])将n按位数存储分别计算,

    这样最后算出来的个数实际上为([0,r))的,所以计算时上界应该+1

    计算个数时如遇到4或62直接退出,详见代码

    Code

    #include <cstdio>
    #include <cstring>
    
    int n,m,f[10][10];
    
    inline void Init(){
    	memset(f,0,sizeof(f));
    	f[0][0]=1;
    	for(int i=1;i<=7;++i)
    		for(int j=0;j<=9;++j)
    			for(int k=0;k<=9;++k)
    				if(j!=4&&!(k==2&&j==6))//注意6和2的位置
    					f[i][j]+=f[i-1][k];
    }
    
    int DP(int k){
    	if(!k) return 0;
    	int len=0,d[10],r=0;
    	while(k){
    		d[++len]=k%10;
    		k/=10;
    	}
    	d[len+1]=0;
    	for(int i=len;i;i--){
    		for(int j=0;j<d[i];++j)
    			if(j!=4&&!(j==2&&d[i+1]==6))
    				r+=f[i][j];
    		if(d[i]==4||(d[i]==2&&d[i+1]==6))//直接跳出
    			break;
    	}
    	return r;
    }
    
    int main(){
    	while(~scanf("%d%d",&n,&m)&&n+m){
    		Init();
    		printf("%d
    ",DP(m+1)-DP(n));
    	}
    	return 0;
    } 
    
  • 相关阅读:
    vue中minxin---小记
    微信认证
    Fatal error Using $this when not in object context in
    $.ajax()方法详解
    $.post
    jquery中的each
    jquery的$.extend和$.fn.extend作用及区别
    javascript字符串函数
    serializeArray()与serialize()的区别
    一个登陆界面
  • 原文地址:https://www.cnblogs.com/void-f/p/8087467.html
Copyright © 2020-2023  润新知