hdu2089不要62(数位dp)

题目大意就是数字中不能出现 62 和4

代码:

/*************************************************************************
> File Name: 2089.cpp
> Author: minshik
> Created Time: 2014年05月22日 星期四 00时52分49秒
************************************************************************/
//数位dp
//
#include <string>
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <vector>
#include <list>
#include <map>
#include <queue>
#include <cmath>
using namespace std;

int dp[10][3]; //i,j 表示i位 0:没有,1:最后一个是6,2:已经有不符和了

int DP(int n)
{
bool flag = false;
int s[15];
int idx = 0;
int x = n;
while(x)
{
s[++idx] = x%10;
x/=10;
}
s[idx+1] =0;
int ans = 0;
for(int i=idx;i>0;i--)
{
ans += (dp[i-1][2]*s[i]); //之前已经有不符和
if( flag )ans+=(dp[i-1][0]*s[i]);
else
{
if( s[i] >4 ) ans+= dp[i-1][0];
if( s[i] > 6 ) ans+=dp[i-1][1];
if( s[i+1]==6 && s[i]>2 ) ans+=dp[i][1];
}
if( s[i]==4 || s[i+1]==6&&s[i]==2 )
{
flag = true;
}
}
return n-ans;
}

int main()
{
dp[0][0] = 1;
for(int i=1;i<=8;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][0]+dp[i-1][1]+dp[i-1][2]*10;
}
int n,m;
while(scanf("%d %d",&n,&m)!=EOF)
{
if( n==0 && m ==0 )break;

printf("%d\n",DP(m+1)-DP(n));
}
return 0;
}

hdu2089不要62(数位dp),布布扣,bubuko.com

时间: 2024-12-15 04:09:24

hdu2089不要62(数位dp)的相关文章

HDU2089 不要62[数位DP]

不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 36862    Accepted Submission(s): 13418 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可

hdu2089不要62(数位dp)

不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 43588    Accepted Submission(s): 16034 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可

[ACM] hdu 2089 不要62(数位Dp)

不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 19043    Accepted Submission(s): 6442 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就

HDU 2089 不要62(数位DP,三种姿势)

HDU 2089 不要62(数位DP,三种姿势) ACM 题目地址:HDU 2089 题意: 中文题意,不解释. 分析: 100w的数据,暴力打表能过 先初始化dp数组,表示前i位的三种情况,再进行推算 直接dfs,一遍搜一变记录,可能有不饥渴的全部算和饥渴的部分算情况,记录只能记录全部算(推荐看∑大的详细题解Orz) 代码: 1. 暴力 (以前写的) /* * Author: illuz <iilluzen[at]gmail.com> * File: 2089_bf.cpp * Create

hud 2089 不要62 (数位dp)

#include<stdio.h> #include<string.h> #include<math.h> #define max 10 int dp[max][3]; int number[max]; //dp[i][0] 前i位数中不符合要求的总个数 //dp[i][1] 前i位数中最高位是2的个数 //dp[i][2] 前i位数中存在含4和有连续62的个数 void init() { memset(dp,0,sizeof(dp)); dp[0][0]=1; for

【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按位数存储分别计算, 这样最后

HDU 2089 不要62(数位dp)

题意:给定一个区间[n, m],求这个区间当中不含62和4的个数.例如62315,88914就是不符合条件的. 数位dp第一题,dp[i][j]表示以 j 开头的 i 位数满足条件的个数,先要预处理出来所有的情况, 下面是预处理的核心.其中k表示j后面的那一位.max_len是题目中给的n的最大位数,这里是7,第二层for是枚举第max_len - i位的值. for (int i = 1; i <= max_len; i++) { for (int j = 0; j <= 9; j++) {

HDU 2089 不要62(数位dp&amp;记忆化搜索)

题目链接:[kuangbin带你飞]专题十五 数位DP C - 不要62 题意 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer). 杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众. 不吉利的数字为所有含有4或62的号码.例如: 62315 73418 88914 都属于不吉利号码.但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列. 你的任务是,对于每次给

HDU 2089 不要62 (数位dp水题)

不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 32358    Accepted Submission(s): 11514 题目链接 Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样