FZU

来源:互联网 发布:网络管理零基础知乎 编辑:程序博客网 时间:2024/06/06 08:30

                                                     题 目 传 送 门:

 x=a[0]a[1]...a[len-2]a[len-1],所有下标为奇数的数都>=他左右的数的称为Mountain Number ,找L~R中Mountain Number的个数

思路:数位dp,dp[i][j][k],i表示第i位,j表示奇数位还是偶数位,k表示前一位的数


ac代码:

#include <iostream>#include <cstdio>#include <cstring>using namespace std;int num[20];long long dp[20][20][2];int len;long long dfs(int len1,int tmp,int state,int limit){    if(len1<0)    return 1;    if(!limit&&dp[len1][state][tmp]!=-1)    return dp[len1][state][tmp];    int fp=limit?num[len1]:9;    long long ret=0;    for(int i=0;i<=fp;i++)    {        if(!tmp&&i<=state)        ret+=dfs(len1-1,1,i,limit&&i==fp);        if(tmp&&i>=state)        ret+=dfs(len1-1,0,i,limit&&i==fp);    }    if(!limit)    dp[len1][state][tmp]=ret;    return ret;}long long get_num(long long x){    len=0;    while(x)    {        num[len++]=x%10;        x=x/10;    }    return dfs(len-1,0,10,1);}int main(){    int n,m,t;    memset(dp,-1,sizeof(dp));    cin>>t;    while(t--)    {       cin>>n>>m;       long long ans=get_num(m)-get_num(n-1);       cout<<ans<<endl;    }    return 0;}


原创粉丝点击