本文主要是介绍FZU - 2109 Mountain Number,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题 目 传 送 门:
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;
}
这篇关于FZU - 2109 Mountain Number的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!