HDU 5898 odd-even number(数位dp)
2016-09-21 16:34
344 查看
就是奇数要连续长度为偶数,偶数连续长度为奇数
记录一下到这里为止奇数偶数的个数就行了,dfs的时候标记一下是否是前导0
代码:
记录一下到这里为止奇数偶数的个数就行了,dfs的时候标记一下是否是前导0
代码:
#include <map> #include <set> #include <stack> #include <queue> #include <cmath> #include <string> #include <vector> #include <cstdio> #include <cctype> #include <cstring> #include <sstream> #include <cstdlib> #include <iostream> #include <algorithm> #pragma comment(linker, "/STACK:102400000,102400000") using namespace std; #define MAX 40005 #define MAXN 6005 #define maxnode 15 #define sigma_size 30 #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define lrt rt<<1 #define rrt rt<<1|1 #define middle int m=(r+l)>>1 #define LL long long #define ull unsigned long long #define mem(x,v) memset(x,v,sizeof(x)) #define lowbit(x) (x&-x) #define pii pair<int,int> #define bits(a) __builtin_popcount(a) #define mk make_pair #define limit 10000 //const int prime = 999983; const int INF = 0x3f3f3f3f; const LL INFF = 0x3f3f; const double pi = acos(-1.0); //const double inf = 1e18; const double eps = 1e-8; const LL mod = 1e9+7; const ull mx = 133333331; /*****************************************************/ inline void RI(int &x) { char c; while((c=getchar())<'0' || c>'9'); x=c-'0'; while((c=getchar())>='0' && c<='9') x=(x<<3)+(x<<1)+c-'0'; } /*****************************************************/ int a[25]; LL dp[25][25][25]; LL dfs(int len,int numo,int nume,int fp,int z){ if(len==0){ if(z) return 0; if(numo%2==0&&nume==0) return 1; if(numo==0&&nume%2) return 1; return 0; } if(!fp&&!z&&dp[len][numo][nume]!=-1) return dp[len][numo][nume]; LL ans=0; int cnt=fp?a[len]:9; for(int i=0;i<=cnt;i++){ if(i==0&&z) ans+=dfs(len-1,numo,nume,0,1); else{ if(i%2&&((nume%2)||nume==0)) ans+=dfs(len-1,numo+1,0,fp&&(i==cnt),0); else if(i%2==0&&((numo%2==0)||(numo==0))) ans+=dfs(len-1,0,nume+1,fp&&(i==cnt),0); } } if(!fp&&!z) dp[len][numo][nume]=ans; return ans; } LL solve(LL x){ if(x==0) return 0; int len=0; while(x){ a[++len]=x%10; x/=10; } return dfs(len,0,0,1,1); } int main(){ int t,kase=0; cin>>t; while(t--){ LL L,R; scanf("%I64d%I64d",&L,&R); kase++; mem(dp,-1); //cout<<solve(R)<<endl; //cout<<solve(L-1)<<endl; printf("Case #%d: %I64d\n",kase,solve(R)-solve(L-1)); } return 0; }
相关文章推荐
- hdu 5898 odd-even number 数位DP
- hdu 5898 odd-even number (数位dp)
- hdu 5898 odd-even number(基础数位DP)
- HDU 5898 odd-even number (数位DP)
- hdu 5898 - odd-even number (2016沈阳网络赛) - 数位dp
- hdu_5898_odd-even number(数位DP)
- HDU 5898 odd-even number 2016年沈阳网络赛 (数位dp)
- HDU 5898 odd-even number——数位dp
- 【2016-沈阳赛区网络赛-G】记忆化搜索,数位DP(odd-even number,hdu 5898)
- HDU 5898 odd-even number(数位DP)
- HDU 5898 odd-even number 数位dp
- HDU 5898 odd-even number 数位DP
- hdu 5898 odd-even number (数位dp)
- hdu 5898 odd-even number (数位dp 沈阳网络赛)
- [hdu 5898 odd-even number] 数位DP
- HDU 5898 odd-even number(数位dp)
- Hdu-5898 odd-even number(数位DP)
- HDU 5898 odd-even number (数位DP) -2016 ICPC沈阳赛区网络赛
- HDU 5898 odd-even number (数位DP) 2016 ACM/ICPC Asia Regional Shenyang Online
- HDU 5898 odd-even number (数位DP) 2016 ACM/ICPC Asia Regional Shenyang Online