FZU2109数位DP

来源:互联网 发布:mac下的办公软件 编辑:程序博客网 时间:2024/05/26 17:45
#include<iostream>#include<cstdio>#include<list>#include<algorithm>#include<cstring>#include<string>#include<queue>#include<stack>#include<map>#include<vector>#include<cmath>#include<memory.h>#include<set>#define ll long long#define LL __int64const ll INF=9999999999999;#define eps 1e-16using namespace std;#define M 15#define inf 0xfffffff//vector<int,int> G[20002];//vector<pair<int,int>> ::iterator iter;//map<ll,int>mp;//map<ll,int>::iterator p;//看别人的代码打的,果然多的思维太弱了,留着以后琢磨#define N 15int f[2][N][N],a[N];int dfs(int pos,int pre,int k,int isFirst,int isEnd){////isEnd为边界if(pos<0)return 1;if(isEnd==0&&f[k][pos][pre]!=-1)return f[k][pos][pre];int res=0;int n=9;if(isEnd)n=a[pos];//比如1234   pos=2,可以999但pos=1只能到1234for(int i=0;i<=n;i++){if(isFirst&&i==0)res+=dfs(pos-1,9,0,1,0);//前导0,isFirst不变else if(k&&i>=pre)res+=dfs(pos-1,i,k^1,0,isEnd&&i==n);//k=1,当前为奇else if(k==0&&i<=pre)res+=dfs(pos-1,i,k^1,0,isEnd&&i==n);}if(isEnd==0)f[k][pos][pre]=res;return res;}int dp(int n){int i;for(i=-1;n;n/=10)a[++i]=n%10;memset(f,-1,sizeof(f));return dfs(i,9,0,1,1);}int main(){int T,l,r;scanf("%d",&T);while(T--){scanf("%d%d",&l,&r);printf("%d\n",dp(r)-dp(l-1));}return 0;}

原创粉丝点击