不要62——数位DP

  最近学了数位DP,于是就做了做这道题……

  

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int getin(){
    int num=0,t=1;
    char c=getchar();
    while(c>‘9‘||c<‘0‘){if(c==‘-‘)t=-1;c=getchar();}
    while(c<=‘9‘&&c>=‘0‘){num=num*10+c-‘0‘;c=getchar();}
    return num*t;
}
int main()
{
    freopen("a.in","r",stdin);
    freopen("2.out","w",stdout);
    int l,r;
    while(1){
        scanf("%d%d",&l,&r);
        if(l+r==0)break;
        int ans=0;
        for(int i=l;i<=r;i++){
            int n=i,t=1;
            int len=0,digit[10];
            while(n!=0){//统计n的位数
                digit[++len]=n%10;
                n/=10;
            }
            digit[len+1]=0;
            for(int j=len;j>=1;j--){
                if(digit[j]==4||digit[j]==2&&digit[j+1]==6) t=0;
            }
            if(t)ans++;
           }
           cout<<ans<<"\n";
    }
    return 0;
}

  这是一个最普通的做法了,简单的暴力一下。其实也可以打个表。

  

#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int dp[15][10];
void init(){//初始化
    memset(dp,0,sizeof(dp));
    dp[0][0]=1;
    for(int i=1;i<=11;i++){
        for(int j=0;j<=9;j++){//枚举第i位可能出现的数
            for(int k=0;k<=9;k++){//枚举第i-1位可能出现的数
                if(j!=4&&!(j==6&&k==2))
                    dp[i][j]+=dp[i-1][k];
            }
        }
    }
}
int solve(int n){
    int digit[15];//从低到高保存n的每一位
    int len=0,ans=0;
    while(n!=0){//统计n的位数
        digit[++len]=n%10;n/=10;
    }
    digit[len+1]=0;//方便处理
    for(int i=len;i>=1;i--){//枚举当前位数
        for(int j=0;j<digit[i];j++){
            if(j!=4&&!(digit[i+1]==6&&j==2))
                ans+=dp[i][j];
        }
        if(digit[i]==4||(digit[i]==2&&digit[i+1]==6))
            break; //如果高位出现过“62”或“4”就break
    }
    return ans;
}
int main()
{
    freopen("a.in","r",stdin);
    freopen("1.out","w",stdout);
    int l,r;
    init();
    while(1){
        scanf("%d%d",&l,&r);
        if(l+r==0)break;
        printf("%d\n",solve(r+1)-solve(l));
        //因为是solve是计算区间[0,n)的,所以要r+1
    }
    return 0;
}

  然后现在是正解数位DP了。

  本文由Yzyet编写,网址为www.cnblogs.com/Yzyet。非Yzyet同意,禁止转载,侵权者必究。

时间: 2024-11-03 03:32:57

不要62——数位DP的相关文章

[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)

题目大意就是数字中不能出现 62 和4 代码: /************************************************************************* > File Name: 2089.cpp > Author: minshik > Created Time: 2014年05月22日 星期四 00时52分49秒 *****************************************************************

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++) {

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).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可

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).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样

HDU 2089 不要62 数位DP入门

Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众.不吉利的数字为所有含有4或62的号码.例如:62315 73418 88914都属于不吉利号码.但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列.你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多