一本通1586【 例 2】数字游戏

1586:【 例 2】数字游戏

时间限制: 1000 ms         内存限制: 524288 KB

题目描述

科协里最近很流行数字游戏。某人命名了一种不降数,这种数字必须满足从左到右各位数字成小于等于的关系,如 123,446。现在大家决定玩一个游戏,指定一个整数闭区间 [a,b],问这个区间内有多少个不降数。

输入格式

有多组测试数据。每组只含两个数字 a,b,意义如题目描述。

输出格式

每行给出一个测试数据的答案,即 [a, b] 之间有多少不降数。

样例

样例输入

1 9
1 19

样例输出

9
18

数据范围与提示

对于全部数据,1≤a≤b≤2^31?1。

sol:非常友好的数位dp,dp[i][j][bo1][bo2] 第i位,填的数字为j,是否是上界,是否是前导0

暴力统计+暴力转移就OK了

#include <bits/stdc++.h>
using namespace std;
int Num[20];
int dp[20][10][2][2];
//第i位,数字为j,是否为上界,是否为前导0
inline int dfs(int Weiz,int Shuz,bool Shangj,bool Qiand0)
{
    if(dp[Weiz][Shuz][Shangj][Qiand0]) return dp[Weiz][Shuz][Shangj][Qiand0];
    if(Weiz==1) return (dp[Weiz][Shuz][Shangj][Qiand0]=1);
    int i,Down=(Qiand0)?(0):(Shuz),Up=(Qiand0)?(9):(Shangj?Num[Weiz-1]:9);
//    printf("Down=%d Up=%d\n",Down,Up);
    for(i=Down;i<=Up;i++)
    {
        bool Bo1=(Shangj&&i==Up),Bo2=(Qiand0&&i==0);
        dp[Weiz][Shuz][Shangj][Qiand0]+=dfs(Weiz-1,i,Bo1,Bo2);
    }
    return dp[Weiz][Shuz][Shangj][Qiand0];
}
inline int Solve(int n)
{
    if(n==0) return 1;
    *Num=0;
    while(n)
    {
        Num[++*Num]=n%10;
        n/=10;
    }
    int i,ans=0;
    ans+=dfs(*Num,0,0,1);
//    printf("Beg ans=%d\n",ans);
    for(i=1;i<Num[*Num];i++) ans+=dfs(*Num,i,0,0);
//    printf("End ans=%d\n",ans);
    ans+=dfs(*Num,Num[*Num],1,0);
//    printf("ans=%d\n",ans);
    memset(dp,0,sizeof dp);
    return ans;
}
int main()
{
//    freopen("test1.in","r",stdin);
//    freopen("my.out","w",stdout);
    int i,l,r;
    while(~scanf("%d%d",&l,&r))
    {
        printf("%d\n",Solve(r)-Solve(l-1));
    }
}
/*
input
1 9
1 19
3601 152425051
output
9
18
36116
*/

原文地址:https://www.cnblogs.com/gaojunonly1/p/10359395.html

时间: 2024-09-29 01:54:52

一本通1586【 例 2】数字游戏的相关文章

Vijos P1218 数字游戏

描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k.游戏的要求是使你所得的k最大或者最小. 格式 输入格式 输入文件第一行有两个整数,n(1≤n≤50)和m(1≤m≤9).以下n行每行有个整数,其绝对值不大于10^410?4??,按顺序给出圈中的数字,首尾相接. 输出

1861 奶牛的数字游戏 2006年USACO

codevs——1861 奶牛的数字游戏 2006年USACO 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题解 题目描述 Description 奶牛们又在玩一种无聊的数字游戏.输得很郁闷的贝茜想请你写个程序来帮她在开局时预测结果.在游戏的开始,每头牛都会得到一个数N(1<=N<=1,000,000).此时奶牛们的分数均为0.如果N是奇数,那么奶牛就会把它乘以3后再加1.如果N是偶数,那么这个数就会被除以2.数字每变动一次,这头奶牛就得到1分.当N的

codevs1085数字游戏(环形DP+划分DP )

1085 数字游戏 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k.游戏的要求是使你所得的k最大或者最小. 例如,对于下面这圈数字(n=4,m=2): 2

NOIP2003pj数字游戏[环形DP]

题目描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k.游戏的要求是使你所得的k最大或者最小. 例如,对于下面这圈数字(n=4,m=2): 要求最小值时,((2-1) mod 10)×((4+3) mod 10)=1×7=7,要求最大值时,为((2+4+3) mod

数字游戏

时间限制: 1 s 空间限制: 128000 KB 题目等级 : 白银 Silver 题目描述 Description Lele 最近上课的时候都很无聊,所以他发明了一个数字游戏来打发时间.  这个游戏是这样的,首先,他拿出几张纸片,分别写上0到9之间的任意数字(可重复写某个数字),然后,他叫同学随便写两个数字X和K.Lele要做的事情就是重新拼这些纸牌,组成数字 T ,并且 T + X 是 K 的正整数倍. 有时候,当纸片很多的时候,Lele经常不能在一节课之内拼出来,但是他又想知道答案,所以

蓝桥杯-数字游戏

问题描述 栋栋正在和同学们玩一个数字游戏. 游戏的规则是这样的:栋栋和同学们一共n个人围坐在一圈.栋栋首先说出数字1.接下来,坐在栋栋左手边的同学要说下一个数字2.再下面的一个同学要从上一个同学说的数字往下数两个数说出来,也就是说4.下一个同学要往下数三个数,说7.依次类推. 为了使数字不至于太大,栋栋和同学们约定,当在心中数到 k-1 时,下一个数字从0开始数.例如,当k=13时,栋栋和同学们报出的前几个数依次为: 1, 2, 4, 7, 11, 3, 9, 3, 11, 7. 游戏进行了一会

洛谷-小鱼的数字游戏-数组

题目描述 Description 小鱼最近被要求参加一个数字游戏,要求它把看到的一串数字(长度不一定,以0结束,最多不超过100个),记住了然后反着念出来(表示结束的数字0就不要念出来了).这对小鱼的那点记忆力来说实在是太难了,你也不想想小鱼的整个脑袋才多大,其中一部分还是好吃的肉!所以请你帮小鱼编程解决这个问题. 输入输出格式 Input/output 输入格式:一行内输入一串整数,以0结束,以空格间隔.输出格式:一行内倒着输出这一串整数,以空格间隔. 输入输出样例 Sample input/

P1043 数字游戏

P1043 数字游戏 题目描述 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k.游戏的要求是使你所得的k最大或者最小. 例如,对于下面这圈数字(n=4,m=2): 要求最小值时,((2-1) mod 10)×((4+3) mod 10)=1×7=7,要求最大值时,为((

2003数字游戏

题目描述 Description 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k.游戏的要求是使你所得的k最大或者最小. 例如,对于下面这圈数字(n=4,m=2): 2 4                           -1 3 当要求最小值时,((2-1) mo