HDU 5898 odd-even number (数位DP)
2017-08-29 19:42
337 查看
题意:
求l~r 连续的奇数个数有偶数个,连续偶数的个数有奇数个 的 数字个数
#include <map>
#include <set>
#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll dp[20][5];
int digit[20];
/// 0 前导0
/// 1 奇数的个数有奇数个
/// 2 奇数的个数有偶数个
/// 3 偶数的个数有奇数个
/// 4 偶数的个数有偶数个
ll dfs(int len,int limit,int status)
{
if(len<0)
{
if(status==2||status==3)
return 1;
return 0;
}
if(!limit&&dp[len][status]!=-1)
return dp[len][status];
int last;
if(limit) last=digit[len];
else last=9;
ll ans=0;
for(int i=0;i<=last;i++)
{
if(status==0)
{
if(i==0) ans+=dfs(len-1,0,0);
else
{
if(i&1)
ans+=dfs(len-1,limit&&i==last,1);
else
ans+=dfs(len-1,limit&&i==last,3);
}
}
else if(status==1)
{
if(i%2)
ans+=dfs(len-1,limit&&i==last,2);
}
else if(status==2)
{
if(i%2==0)
ans+=dfs(len-1,limit&&i==last,3);
else ans+=dfs(len-1,limit&&i==last,1);
}
else if(status==3)
{
if(i%2==0)
ans+=dfs(len-1,limit&&i==last,4);
else ans+=dfs(len-1,limit&&i==last,1);
}
else if(status==4)
{
if(i%2==0) ans+=dfs(len-1,limit&&i==last,3);
}
}
if(!limit)
dp[len][status] = ans;
return ans;
}
ll solve(ll x)
{
memset(dp,-1,sizeof(dp));
int cnt=0;
while(x!=0)
{
digit[cnt++]=x%10;
x/=10;
}
return dfs( cnt-1, 1, 0 ) ;
}
int main()
{
int t;
scanf("%d",&t);
for(int cs=1;cs<=t;cs++)
{
ll l,r;
scanf("%lld%lld",&l,&r);
printf("Case #%d: ",cs);
printf("%lld\n",solve(r)-solve(l-1));
}
}
求l~r 连续的奇数个数有偶数个,连续偶数的个数有奇数个 的 数字个数
#include <map>
#include <set>
#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll dp[20][5];
int digit[20];
/// 0 前导0
/// 1 奇数的个数有奇数个
/// 2 奇数的个数有偶数个
/// 3 偶数的个数有奇数个
/// 4 偶数的个数有偶数个
ll dfs(int len,int limit,int status)
{
if(len<0)
{
if(status==2||status==3)
return 1;
return 0;
}
if(!limit&&dp[len][status]!=-1)
return dp[len][status];
int last;
if(limit) last=digit[len];
else last=9;
ll ans=0;
for(int i=0;i<=last;i++)
{
if(status==0)
{
if(i==0) ans+=dfs(len-1,0,0);
else
{
if(i&1)
ans+=dfs(len-1,limit&&i==last,1);
else
ans+=dfs(len-1,limit&&i==last,3);
}
}
else if(status==1)
{
if(i%2)
ans+=dfs(len-1,limit&&i==last,2);
}
else if(status==2)
{
if(i%2==0)
ans+=dfs(len-1,limit&&i==last,3);
else ans+=dfs(len-1,limit&&i==last,1);
}
else if(status==3)
{
if(i%2==0)
ans+=dfs(len-1,limit&&i==last,4);
else ans+=dfs(len-1,limit&&i==last,1);
}
else if(status==4)
{
if(i%2==0) ans+=dfs(len-1,limit&&i==last,3);
}
}
if(!limit)
dp[len][status] = ans;
return ans;
}
ll solve(ll x)
{
memset(dp,-1,sizeof(dp));
int cnt=0;
while(x!=0)
{
digit[cnt++]=x%10;
x/=10;
}
return dfs( cnt-1, 1, 0 ) ;
}
int main()
{
int t;
scanf("%d",&t);
for(int cs=1;cs<=t;cs++)
{
ll l,r;
scanf("%lld%lld",&l,&r);
printf("Case #%d: ",cs);
printf("%lld\n",solve(r)-solve(l-1));
}
}
相关文章推荐
- 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
- 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-沈阳赛区网络赛-G】记忆化搜索,数位DP(odd-even number,hdu 5898)
- hdu 5898 odd-even number 数位DP
- HDU 5898 odd-even number 2016年沈阳网络赛 (数位dp)
- hdu 5898 - odd-even number (2016沈阳网络赛) - 数位dp
- HDU 5898 odd-even number 数位dp
- [hdu 5898 odd-even number] 数位DP
- HDU 5898 odd-even number (数位DP) 2016 ACM/ICPC Asia Regional Shenyang Online