HUD 2089 位数dp

/*
做的不多的位数dp
暴力的话 不知道多少组数据 会T
所以写dp 思路就和数学课本上那种“不超过xxx的x位偶数有几个”
这里可以类似的维护一个前缀和模样的东西(但又不同于前缀和)
状态:f[i][j] 表示以j开头的i位数符合条件的个数 (j可以是0)
然后可以已处理一下像是10000这种整的数 注意舍去不符合条件的
然后对于一个像123456这样不整的数 就从低位逐位找
先找位数是1的 以<6开头的所有符合条件的个数
再找位数是2的 以<5开头的....
以此类推
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int st,en,ans,data[10],l,f[10][10];
void ready()
{
    f[0][0]=1;
    for(int i=1;i<=7;i++)//枚举位数
      for(int j=0;j<=9;j++)//枚举第i为是什么
        for(int k=0;k<=9;k++)//枚举第i-1为是什么
          if((j==6&&k==2)||j==4||k==4)continue;//舍去
          else f[i][j]+=f[i-1][k];
}
void get_data(int x)
{
    while(x>0)
      {
          data[++l]=x%10;
          x=x/10;
      }
}
int slove(int x)
{
    ans=0;l=0;
    memset(data,0,sizeof(data));
    get_data(x);//得到每一个数拆完是什么
    for(int i=l;i>=1;i--)//从低位枚举位数
      {
          for(int j=0;j<data[i];j++)//枚举第i位是什么 枚举到<data[i]
            if((j==2&&data[i+1]==6)||j==4)continue;
            else ans+=f[i][j];
        if(data[i]==4||(data[i]==2&&data[i+1]==6))break;//往后找的一定包含这个4 或者62 就不用找了
      }
    return ans;
}
int main()
{
    //freopen("cin.in","r",stdin);
    //freopen("test.out","w",stdout);
    ready();
    while(1)
      {
          scanf("%d%d",&st,&en);
          if(st==0&&en==0)break;
        printf("%d\n",slove(en+1)-slove(st));
      }
    return 0;
}
时间: 2024-10-06 10:32:38

HUD 2089 位数dp的相关文章

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

foj 2109 Mountain Number 位数dp

 题目链接  Problem 2109 Mountain Number Accept: 139    Submit: 357 Time Limit: 1000 mSec    Memory Limit : 32768 KB Problem Description One integer number x is called "Mountain Number" if: (1) x>0 and x is an integer; (2) Assume x=a[0]a[1]...a[le

HDOJ 2089 数位DP

链接: http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意: 给你一个区间,问你这个区间有多少个数字不包含4 和 62 代码: 31 int a[20]; 32 int dp[20][2]; 33 34 int dfs(int pos, int pre, int sta, bool limit) { 35 if (pos == -1) return 1; 36 if (!limit && dp[pos][sta] != -1) return

hdu 2089(数位DP)

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

HUD 2089

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

HDU 2089 数位dp入门

开始学习数位dp...一道昨天看过代码思想的题今天打了近两个小时..最后还是看了别人的代码找bug...(丢丢) 传说院赛要取消 ? ... 这么菜不出去丢人也好吧~ #include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<math.h> #include<queue> using namespace std; int n,m; /

HDU 不要62 2089 数位DP

属于数位DP中的模版题 #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<cmath> using namespace std; typedef long long LL; #define MOD 2520 int dp[20][2];//dp[数字的长度][数字的第一位数字]: int bit[20], p = 0; int df

HDU 2089 数位dp/字符串处理 两种方法

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

hdu 2089 不要62 【数位DP】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 数位DP模板题,测试板子 代码: #include <stdio.h> #include <ctime> #include <math.h> #include <limits.h> #include <complex> #include <string> #include <functional> #include &l