这题是数位dp,我不会哼哼,但是队友会,上了个厕所就被a出来了,
转载自队友博客:http://blog.csdn.net/qq_34872380/article/details/52588809
点击打开链接
题意有点绕,odd-even数就是一个数 比方11222 就是,因为连续奇数的长度为2 而连续偶数的长度为3,但是11222333不行,因为3个3不满足连续奇数为偶数长度的条件。
数位DP,dp[len][pre][e] 代表第几位,之前一位是奇数还是偶数,e表示是否还要添加一个与pre同为奇数或者偶数的数。
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- using namespace std;
- long long int dp[20][2][2];
- int a[20];
- long long int dfs(int len,int pre,int e,bool flag,bool s)
- {
- if(len<0)
- {
- return e==1?0:1;
- }
- if(flag==false&&dp[len][pre][e]!=-1&&s)
- {
- return dp[len][pre][e];
- }
- long long int ans=0;
- int cnt=flag?a[len]:9;
- for(int i=0; i<=cnt; i++)
- {
- if(s==false)
- {
- if(i==0)
- ans+=dfs(len-1,0,0,flag&&i==cnt,false);
- else
- {
- ans+=dfs(len-1,i%2,i%2==1?1:0,flag&&i==cnt,true);
- }
- }
- else if(i%2==1)
- {
- if(pre%2==1)
- ans+= dfs(len-1,1,e^1,flag&&i==cnt,true);
- else
- {
- if(e==0)
- {
- ans+= dfs(len-1,1,1,flag&&i==cnt,true);
- }
- }
- }
- else
- {
- if(pre%2==0)
- ans+=dfs(len-1,0,e^1,flag&&i==cnt,true);
- else
- {
- if(e==0)
- {
- ans+=dfs(len-1,0,0,flag&&i==cnt,true);
- }
- }
- }
- }
- if(!flag&&s)
- dp[len][pre][e]=ans;
- return ans;
- }
- long long int solve(long long int x)
- {
- int len=0;
- memset(a,0,sizeof(0));
- while(x>0)
- {
- a[len++]=x%10;
- x/=10;
- }
- return dfs(len-1,0,0,true,false);
- }
- int main()
- {
- int t,ca=1;
- scanf("%d",&t);
- memset(dp,-1,sizeof(dp));
- while(t--)
- {
- long long int l,r;
- scanf("%I64d%I64d",&l,&r);
- printf("Case #%d: %I64d\n",ca++,solve(r)-solve(l-1));
- }
- return 0;
- }
比赛的时候在OB 感谢队友带我飞