zoukankan      html  css  js  c++  java
  • HDU 2089

    第一次做数位DP,有点摸不着头脑,嗯,参考了别人的之后隔了大半天自己再写的

    dp[i][0],表示不存在不吉利数字  

    dp[i][1],表示不存在不吉利数字,且最高位为2  

    dp[i][2],表示存在不吉利数字

    具体能自己理解代码的

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    using namespace std;
    
    int dp[10][3];
    int a[10],len;
    int n,m;
    
    void Initial(){
    	memset(dp,0,sizeof(dp));
    	dp[0][0]=1;
    	for(int i=1;i<10;i++){
    		dp[i][0]=dp[i-1][0]*9-dp[i-1][1];
    		dp[i][1]=dp[i-1][0];
    		dp[i][2]=dp[i-1][2]*10+dp[i-1][1]+dp[i-1][0];
    	}
    }
    
    int slove(int x){
    	int tmp=x;
    	len=0;
    	while(x){
    		a[++len]=x%10;
    		x/=10;
    	}
    	a[len+1]=0;
    	int ans=0;
    	bool flag=false;
    	for(int i=len;i>0;i--){
    		ans+=dp[i-1][2]*a[i];
    		if(flag){	//当前面的数已经不吉利,那么后面的数就会全部都不吉利 
    			ans+=dp[i-1][0]*a[i];
    		}
    		if(!flag&&a[i]>4)	//这里必须是大于号,因为有等于号的 话,就不能完全的统计0~9的全部数字的情况了 
    		ans+=(dp[i-1][0]);
    		if(!flag&&a[i]>6){
    			ans+=dp[i-1][1];
    		}
    		if(!flag&&a[i+1]==6&&a[i]>2){
    			ans+=dp[i-1][0];
    		}
    		if(a[i]==4||(a[i+1]==6&&a[i]==2))
    		flag=true;
    	}
    	return tmp-ans;
    }
    
    int main(){
    	Initial();
    	while(scanf("%d%d",&n,&m)&&n||m){
    		printf("%d
    ",slove(m+1)-slove(n));	//这里用加1,没有影响,因为否则需要N-1,但事先并没有确定N的值是否吉利,会增加代码,
    		//加1后,就可以很好的避免了。 
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    Promise原理实现(一):前置知识点
    移动端禁用缩放
    多条命令同时执行的包concurrently
    通过面试题学JavaScript知识(1)
    移动设备适配
    css 文本溢出显示省略号
    变量对象的理解
    7.10 日志
    7.9 日志
    JMETER接口测试之自动化环境的配置
  • 原文地址:https://www.cnblogs.com/jie-dcai/p/4277895.html
Copyright © 2011-2022 走看看