zoukankan      html  css  js  c++  java
  • UVALive 4877 Non-Decreasing Digits 数位DP

     4877 Non-Decreasing Digits

    A number is said to be made up ofnon-decreasing digitsif all the digits to theleftof any digit is lessthan or equal to that digit. For example, the four-digit number 1234 is composed of digits that arenon-decreasing. Some other four-digit numbers that are composed of non-decreasingdigits are 0011, 1111,1112, 1122, 2223. As it turns out, there are exactly 715 four-digit numbers composed of non-decreasingdigits.Notice that leading zeroes are required: 0000, 0001, 0002 are all valid four-digit numbers withnon-decreasingdigits.For this problem, you will write a program that determines how many such numbers there are witha specified number of digits.

    Input

    The first line of input contains a single integerP(1P1000), which is the number of data sets thatfollow. Each data set is a single line that contains the data set number, followed by a space, followedby a decimal integer giving the number of digitsN(1N64).

    Output

    For each data set there is one line of output. It contains the data set number followed by a single space,followed by the number of N digit values that are composed entirely ofnon-decreasingdigits.

    Sample Input
    3
    1 2
    2 3
    3 4

    Sample Output
    1 55
    2 220
    3 715

    题目意思:求n位非递减数列的个数,可以有相同的数。

    解题思路:数位DP,dp[i][j]表示i位,最高位是j的符合题意的个数。

    之前博客参考 :https://www.cnblogs.com/wkfvawl/p/9438921.html

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #define ll long long int
    using namespace std;
    ll dp[66][11];
    void DPlist()
    {
       ll i,j,k;
        memset(dp,0,sizeof(0));
        for(i=0;i<=9;i++)
        {
            dp[1][i]=1;
        }
        for(i=1;i<=65;i++)///dp[i][j]表示i位,最高位是j的符合题意的个数
        {
            for(j=0;j<=9;j++)
            {
                for(k=0;k<=j;k++)///把上一个位数小于等于j的dp全加起来
                {
                    dp[i+1][j]+=dp[i][k];
                }
            }
            dp[i][10]=0;///用来存总和
            for(j=0;j<=9;j++)
            {
                dp[i][10]+=dp[i][j];
            }
        }
    }
    int main()
    {
        ll t,e,n,i;
        scanf("%d",&t);
        DPlist();
        while(t--)
        {
            scanf("%lld%lld",&e,&n);
            printf("%lld %lld
    ",e,dp[n][10]);
        }
    }
  • 相关阅读:
    资金流学习-成本分析
    解决root用户不能打开Chromium网页浏览器
    Kali Linux 2020.1乱码问题
    Kali Linux安装谷歌浏览器
    解决Kali Linux 2020.1乱码问题
    Kali Linux 2020.1a版本msfconsole启动失败问题
    Kali Linux发布2020.1a版本
    Kali Linux 2020.1快速修改root用户密码
    Kali Linux 2020.1安装桌面
    Kali Linux 2020.1修改系统语言
  • 原文地址:https://www.cnblogs.com/wkfvawl/p/10638698.html
Copyright © 2011-2022 走看看