zoukankan      html  css  js  c++  java
  • HDU2089.不要62(数位DP)

    杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。
    杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
    不吉利的数字为所有含有4或62的号码。例如:
    62315 73418 88914
    都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。
    你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。
    Input
    输入的都是整数对n、m(0<n≤m<1000000),如果遇到都是0的整数对,则输入结束。
    Output
    对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。

    定义(f(i,j))表示(i)位数,首位是(j)的数字有多少符合要求的。

    状态转移如下:

    (j=4)的时候,(f(i,j)=0)

    (j eq 4)的时候,(f(i,j)= sum_{k=0}^9f(i-1,k),(k eq 2 || j eq 6))

    在最后求前缀答案的时候,从前往后遍历n的每一位,对每一位加上状态方程里d(i)-1的前缀和即可。因为默认前面已经遍历过的位是和n卡死的。

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1010;
    int f[maxn][maxn],d[maxn],n,m;
    void init () {
    	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&&!(j==6&&k==2)) {
    					f[i][j]+=f[i-1][k]; 
    				}
    			}
    		}
    	}
    }
    int solve (int n) {
    	int ans=0;
    	int tot=0;
    	while (n) {
    		d[++tot]=n%10;
    		n/=10;
    	}
    	d[tot+1]=0;
    	for (int i=tot;i>=1;i--) {
    		for (int j=0;j<d[i];j++) {
    			if (d[i+1]!=6||j!=2) ans+=f[i][j];
    		}
    		if (d[i]==4||(d[i+1]==6&&d[i]==2)) break;
    	}
    	return ans;
    } 
    int main () {
    	init();
    	while (scanf("%d%d",&m,&n)==2) {
    		if (!n&&!m) break;
    		printf("%d
    ",solve(n+1)-solve(m));
    	} 
    }
  • 相关阅读:
    Moebius实现Sqlserver集群~介绍篇
    知方可补不足~SQL数据库用户的克隆,SQL集群的用户同步问题
    从零开始学C++之动态创建对象
    [置顶] 某大型银行深化系统技术方案之二十五:性能设计之主要数量指标
    POJ 1300 Door Man
    解决SQL查询总是超时已过期
    hdu 1728 逃离迷宫(BFS)
    Nginx 负载均衡-加权轮询策略剖析
    ios 6 横竖屏转换
    firefox同步数据时无响应问题
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/14392164.html
Copyright © 2011-2022 走看看