国内最全IT社区平台 联系我们 | 收藏本站
阿里云优惠2
您当前位置:首页 > 互联网 > [数位dp] spoj 10738 Ra-One Numbers

[数位dp] spoj 10738 Ra-One Numbers

来源:程序员人生   发布时间:2014-10-06 08:00:01 阅读次数:2643次

题意:给定x、y,为[x,y]之间有多少个数的偶数位和减去奇数位和等于一。

个位是第一位。

例子: 10=1-0=1 所以10是这样的数

思路:数位dp[i][sum][ok] i位和为sum 是否含有前导0.

然后就是因为有负数 所以根据范围把0设置为100 然后最后和等于101则为所求的数。

代码:

[cpp] view plaincopyprint?在CODE上查看代码片派生到我的代码片
  1. #include"cstdlib" 
  2. #include"cstdio" 
  3. #include"cstring" 
  4. #include"cmath" 
  5. #include"stack" 
  6. #include"algorithm" 
  7. #include"iostream" 
  8. using namespace std; 
  9. int dp[12][200][2],num[12]; 
  10. int fuck[2]={1,-1}; 
  11. int dfs(int site,int sum,int ok,int f) 
  12. { 
  13.     if(site==0) 
  14.     { 
  15.         if(ok==0) return 0; 
  16.         return sum==101?1:0;  //小处理 和为101 
  17.     } 
  18.     if(!f&&dp[site][sum][ok]!=-1) return dp[site][sum][ok]; 
  19.     int len=f?num[site]:9; 
  20.     int ans=0; 
  21.     for(int i=0;i<=len;i++) 
  22.     { 
  23.         if(ok==0) 
  24.         { 
  25.             if(i==0) ans+=dfs(site-1,sum,ok||i!=0,f&&i==len); 
  26.             else ans+=dfs(site-1,sum+i*fuck[site%2],ok||i!=0,f&&i==len); 
  27.         } 
  28.         else 
  29.         { 
  30.             ans+=dfs(site-1,sum+i*fuck[site%2],ok||i!=0,f&&i==len); 
  31.         } 
  32.     } 
  33.     if(!f) dp[site][sum][ok]=ans; 
  34.     return ans; 
  35. } 
  36. int solve(int x) 
  37. { 
  38.     if(x<0) return 0; 
  39.     int cnt=0; 
  40.     while(x) 
  41.     { 
  42.         num[++cnt]=x%10; 
  43.         x/=10; 
  44.     } 
  45.     return dfs(cnt,100,0,1);  //进入的时候 sum=100 
  46. } 
  47. int main() 
  48. { 
  49.     int t; 
  50.     scanf("%d",&t); 
  51.     memset(dp,-1,sizeof(dp)); 
  52.     while(t--) 
  53.     { 
  54.         int x,y; 
  55.         scanf("%d%d",&x,&y); 
  56.         printf("%d ",solve(y)-solve(x-1)); 
  57.     } 
  58.     return 0; 
  59. } 

生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生