数位DP || Gym 101653R Ramp Number

每一位都大于等于前一位的数叫Ramp Number

给一个数,如果不是Ramp Number输出-1,如果是Ramp Number输出比它小的Ramp Number的个数

只和每一位上的数字有关

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <queue>
#include <algorithm>
using namespace std;
char s[88];
long long f[88][11];//数位dp
int main()
{
    int T;
    scanf("%d", &T);
    memset(f, 0, sizeof(f));
    for(int i = 0; i <= 9; i++) f[1][i] = 1;
    for(int i = 2; i <= 80; i++)
    {
        for(int j = 0; j <= 9; j++)
        {
            for(int k = j; k <= 9; k++)
                f[i][j] += f[i - 1][k];
        }
    }
    /*f[i][j]表示长度为i以j开头的这样的数有多少个
     *f[i][j] = sum(f[i-1][k]) k>=j
     *例如f[3][5] 表示长度为3,以5开头的上升数的个数 即333,334,335,336……
     *只看后两位 33,34,35…… 44,45,46……
     *是长度为2,以3开头的+长度为2,以4开头的+……
     */
     /*
      *加的时候如1345 -> f[4][0] + f[3][1] + f[3][2] + f[2][3] + f[2][4] + f[1][4] + f[1][5]
      *f[4][0] 所有一二三位数,然后固定第一位是1
      *f[3][x] (x >= 1 && x < 3) 取的这些三位数后在前面放1就是结果,然后固定第二位是3
      *以此类推
      */
    while(T--)
    {
        scanf("%s", s);
        int len = strlen(s);
        int flag = 1;
        for(int i = 1; i < len; i++)
        {
            if(s[i] < s[i - 1])
                flag = 0;
        }
        if(!flag)
        {
            printf("-1\n");
            continue;
        }
        long long ans = 0;
        for(int i = 1; i <= len; i++)
        {
            for(int j = i == 1?0:s[i-2] - ‘0‘; j < s[i-1] - ‘0‘; j++)
            {
                ans += f[len-i+1][j];
            }
        }
        printf("%lld\n", ans);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/pinkglightning/p/8978034.html

时间: 2024-10-05 05:50:03

数位DP || Gym 101653R Ramp Number的相关文章

数位dp HDU - 5898 odd-even number

http://acm.hdu.edu.cn/showproblem.php?pid=5898 题意:求两个数中间的满足连续位是奇数的长度是偶数,连续位上是偶数的长度位奇数的数量. 分析:就是数位dp基本写法,dfs 的参数多加了个 a 表示连续位数的长度,flag表示上一位是否为奇数.  这里当奇偶改变时,a 就要变成1 ,并且可以用 a=0 来表示区分是前导0 .然后 记忆化搜索的过程中 ,用continue 表示不满足条件,暂时满足才往下接着搜索. 然后!!     &运算的优先程度比 ==

[数位dp] hdu 3565 Bi-peak Number

题意: 给范围[X,Y],求范围内双峰数位数和最大值是多少. 双峰数定义就是满足一个数 可以分割成两个 /\ /\ 的形式. 思路: dp[site][cur][ok]  site位  前面的数是cur 状态为ok ok分为7种 0:前面所有数都是0 1:第一个峰数且只有一个数 2:第一个峰数在峰顶(可上可下) 3:第一个峰数在峰底(可进入下一个峰或者继续往下) 4:同1 是第二个峰数 5:同2 是第二个峰数 6:同3 但是不可进入下一个峰数了 代码: #include"cstdlib"

[数位dp] hdu 3709 Balanced Number

题意:平衡数问题,就是找一个支点,两边位上的数成力矩和相等 比如 4139 以3作为支点 左边=4*2+1*1 = 右边=9*1 思路: 一开始没想到,一点就恍然大悟. dp[site][n][sum]  n为支点. 然后只要枚举支点就好了. 然后减去00,000,0000这些情况就ok了 #include"cstdlib" #include"cstdio" #include"cstring" #include"cmath"

codeforces Hill Number 数位dp

http://www.codeforces.com/gym/100827/attachments Hill Number Time Limits:  5000 MS   Memory Limits:  200000 KB 64-bit interger IO format:  %lld   Java class name:  Main Description A Hill Number is a number whose digits possibly rise and then possibl

hdu 5898 odd-even number 数位DP

odd-even number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 716    Accepted Submission(s): 385 Problem Description For a number,if the length of continuous odd digits is even and the length

Hdu3079Balanced Number数位dp

枚举支点,然后就搞,记录之前的点的力矩和. #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #include <list> #include <s

HDU 5179 beautiful number (数位dp / 暴力打表 / dfs)

beautiful number Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 801    Accepted Submission(s): 518 Problem Description Let A=∑ni=1ai?10n?i(1≤ai≤9)(n is the number of A's digits). We call A as "

hdu 5787 K-wolf Number 数位dp

数位DP 神模板 详解 为了方便自己参看,我把代码复制过来吧 // pos = 当前处理的位置(一般从高位到低位) // pre = 上一个位的数字(更高的那一位) // status = 要达到的状态,如果为1则可以认为找到了答案,到时候用来返回, // 给计数器+1. // limit = 是否受限,也即当前处理这位能否随便取值.如567,当前处理6这位, // 如果前面取的是4,则当前这位可以取0-9.如果前面取的5,那么当前 // 这位就不能随便取,不然会超出这个数的范围,所以如果前面取

Balanced Number (数位dp)

Balanced Number Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Description A balanced number is a non-negative integer that can be balanced if a pivot is placed at some digit. More specifically, imagine each digit as a box wit