FZU 2109 Mountain Number (数位DP)

来源:互联网 发布:电脑蓝牙软件下载 编辑:程序博客网 时间:2024/05/18 12:05


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[len-2]a[len-1](0≤a[i]≤9, a[0] is positive). Any a[2i+1] is larger or equal to a[2i] and a[2i+2](if exists).

For example, 111, 132, 893, 7 are "Mountain Number" while 123, 10, 76889 are not "Mountain Number".

Now you are given L and R, how many "Mountain Number" can be found between L and R (inclusive) ?

Input

The first line of the input contains an integer T (T≤100), indicating the number of test cases.

Then T cases, for any case, only two integers L and R (1≤L≤R≤1,000,000,000).

Output
For each test case, output the number of "Mountain Number" between L and R in a single line.
Sample Input
31 101 1001 1000
Sample Output
954384


题意:

如果一个>0的整数x,满足a[2*i+1] >= a[2*i]和a[2*i+2],则这个数为Mountain Number。

给出L, R,求区间[L, R]有多少个Mountain Number。

思路:

数位DP,判断当前是偶数位还是奇数位(从0开始),如果是偶数位,那么它要比前一个数的值小,

如果是奇数位,那么它要比前一个数的值大。


#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>using namespace std;int dp[11][11][11];int b[11];int dfs(int pos,int pre,int status,int limit){    if(pos<0) return 1;    if(!limit && dp[pos][pre][status]!=-1) return dp[pos][pre][status];    int end = limit?b[pos]:9;    int ret = 0;    for(int i=0;i<=end;i++) {        if(status && i<=pre) ret+=dfs(pos-1,i,0,limit && i==end);        if(!status && i>=pre) ret+=dfs(pos-1,i,1,limit && i==end);    }    if(!limit) dp[pos][pre][status] = ret;    return ret;}int work(int num){    memset(b,0,sizeof(b));    int i,j,cnt=0;    while(num) {        b[cnt++]=num%10;        num/=10;    }    return dfs(cnt-1,9,1,1);}int main(){    ios::sync_with_stdio(false);    int T,l,r;    cin>>T;    memset(dp,-1,sizeof(dp));    while(T--) {        cin>>l>>r;        cout<<work(r)-work(l-1)<<endl;    }    return 0;}



0 0
原创粉丝点击