您的位置:首页 > 理论基础 > 计算机网络

【2016-沈阳赛区网络赛-G】记忆化搜索,数位DP(odd-even number,hdu 5898)

2016-09-23 14:28 483 查看
http://www.cnblogs.com/fightfordream/p/5885788.html




#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

ll cnt;
ll bit[20];
ll d[20][20][2][2];

ll dp(ll pos,ll len,ll pre,ll zero,ll f)
{
if(pos<0) return (pre&1)!=(len&1);
ll& ans=d[pos][len][pre][zero];
if(f&&ans!=-1) return ans;
ans=0;
ll d=f?9:bit[pos];
for(ll i=0;i<=d;i++)
if(zero==0)
{
if(i==0) ans+=dp(pos-1,0,0,0,f||i<d);
else ans+=dp(pos-1,1,i&1,1,f||i<d);
}
else
{
if(i&1)
{
if(pre&1) ans+=dp(pos-1,len+1,i&1,1,f||i<d);
else if(len&1) ans+=dp(pos-1,1,i&1,1,f||i<d);
}
else
{
if(!(pre&1)) ans+=dp(pos-1,len+1,i&1,1,f||i<d);
else if(!(len&1)) ans+=dp(pos-1,1,i&1,1,f||i<d);
}
}
return ans;
}

ll solve(ll x)
{
cnt=0;
memset(d,-1,sizeof(d));
while(x)
{
bit[cnt++]=x%10;
x/=10;
}
return dp(cnt-1,0,0,0,0);
}

int main()
{
ll T;
scanf("%I64d",&T);
for(ll t=1;t<=T;t++)
{
ll L,R;
scanf("%I64d %I64d",&L,&R);
printf("Case #%I64d: %I64d\n",t,solve(R)-solve(L-1));
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: