ZZUOJ1196: 单调数

简介:

/*
   注意的事项:是输出小于 10^n的正整数的个数哦!开始的时候总比样例输出多一个数,
   纠结了好久,原来是 0加了进去了!
   
   dpI[n][m]表示的是第n位添加数字m(0....9)的构成单调递增数个数 
   dpD[n][m]表示的是第n位添加数字m(0....9)的构成单调递减数个数 
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;

long long dpI[105][10];
long long dpD[105][10];

void init(){
   for(int i=1; i<10; ++i)
       dpI[1][i]=dpD[1][i]=1;
   for(int i=2; i<=100; ++i){
        for(int j=0; j<10; ++j){
           if(j!=0){//单调递增的数一定没有数字0,因为前边的数字最小为 1 
               for(int k=j; k>=1; --k)
                  dpI[i][j]+=dpI[i-1][k];
           }
       
           for(int k=j; k<10; ++k){//单调递减的数字中可以有0,但是第二位为0时,第一位不能为0 
                 if(i==2 && k==0) continue;
              dpD[i][j]+=dpD[i-1][k]; 
           }
        }
   }
}

int main(){
   init();
   int n;
   while(cin>>n){
       long long sum=0;
       for(int j=1; j<=n; ++j){
         for(int i=0; i<10; ++i)
           sum+=dpI[j][i]+dpD[j][i];
         sum-=9;
       }
       cout<<sum<<endl;
   }
   return 0;
}

目录
相关文章
|
7月前
leetcode-738:单调递增的数字
leetcode-738:单调递增的数字
51 0
|
7月前
leetcode-2006:差的绝对值为 K 的数对数目
leetcode-2006:差的绝对值为 K 的数对数目
65 0
|
算法
把数组里面数值排成最小的数
把数组里面数值排成最小的数
36 1
|
7月前
给定 n 个整数,求里面出现次数最多的数,如果有多个重复出现的数,求值最大的那个 给定n个整数,求里面出现次数最多的数,如果有多个重复出现的数,求出值最大的一
给定 n 个整数,求里面出现次数最多的数,如果有多个重复出现的数,求值最大的那个 给定n个整数,求里面出现次数最多的数,如果有多个重复出现的数,求出值最大的一
|
7月前
4.韩信点兵:有一个数,用3除余2;用5除余3;用7除余2,求满足条件的最小数
4.韩信点兵:有一个数,用3除余2;用5除余3;用7除余2,求满足条件的最小数
29 0
|
Cloud Native Go
801. 使序列递增的最小交换次数:动态规划
这是 力扣上的 801. 使序列递增的最小交换次数,难度为 困难。
leetcode 738 单调递增的数字
leetcode 738 单调递增的数字
51 0
leetcode 738 单调递增的数字
|
Python
LeetCode 2006. 差的绝对值为 K 的数对数目
给你一个整数数组 nums 和一个整数 k ,请你返回数对 (i, j) 的数目,满足 i < j 且 |nums[i] - nums[j]| == k 。
101 0
|
移动开发 算法
数的范围的算法
数的范围的算法