HDU 5898 数位DP

来源:互联网 发布:天正建筑t20 mac 编辑:程序博客网 时间:2024/05/21 10:28

odd-even number

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)


Problem Description
For a number,if the length of continuous odd digits is even and the length of continuous even digits is odd,we call it odd-even number.Now we want to know the amount of odd-even number between L,R(1<=L<=R<= 9*10^18).
 

Input
First line a t,then t cases.every line contains two integers L and R.
 

Output
Print the output for each case on one line in the format as shown below.
 

Sample Input
2 1 100 110 220
 
Sample Output
Case #1: 29Case #2: 36


题意:区间[l,r]有多少连续的奇数长度为偶数,连续的偶数长度为奇数的数。


题解:数位dp。


#include<iostream>  #include<stdio.h>  #include<string.h>  #include<algorithm>  using namespace std;  typedef long long ll;  ll dp[20][20][20];  ll digit[20];  ll dfs(ll sum,ll len,ll sum1,ll sum2,bool fp){      if(!len){          if(sum1==0&&sum2%2==1)return 1;//如果以偶数结束,判断连续偶数个数是不是奇数        if(sum2==0&&sum1%2==0)return 1;//如果以奇数结束,判断连续奇数个数是不是偶数        return 0;    }      if(!fp&&dp[len][sum1][sum2]!=-1)return dp[len][sum1][sum2];      ll ret=0,i,fpmax=fp?digit[len]:9;      for(i=0;i<=fpmax;i++){      ll sums=sum*10+i;    ll now1,now2;    if(i%2){    if(sum2%2==0&&sum2!=0)continue;//如果这位是奇数,上位是偶数,如果连续偶数的个数是偶数就gg    now1=sum1+1;    now2=0;    }    else{    if(sum1%2)continue;//这位是偶数,上位是奇数,如果连续奇数的个数是奇数就gg    if(sums)now2=sum2+1;//判0    else now2=0;    now1=0;    }        ret+=dfs(sums,len-1,now1,now2,fp&&i==fpmax);      }      if(!fp)dp[len][sum1][sum2]=ret;      return ret;  }  ll solve(ll n){      ll len=0;      while(n){          digit[++len]=n%10;          n/=10;      }      ll ret=0,i;      ret=dfs(0,len,0,0,true);      return ret;}  int main(){      memset(dp,-1,sizeof(dp));      ll t,x,y,cas=1;      scanf("%lld",&t);      while(t--){          scanf("%lld%lld",&x,&y);          printf("Case #%lld: %lld\n",cas++,solve(y)-solve(x-1));      }      return 0;  }  


0 0
原创粉丝点击