Problem
https://cn.vjudge.net/problem/20836/origin
Soultion
这道题目让我知道了为什么模板里要有lead记录前导0,一开始没记录偏大。
CODE
/*
* @key word:digit DP
* @tesed on:POJ3252 16ms
* @Author: lhq
* @Date: 2017-08-15 21:18:55
* @Last Modified by: lhq
* @Last Modified time: 2017-08-15 21:18:55
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define ll long long
int dp[32][32][32],a[32];
int dfs(int len,int num0,int num1,bool lead,bool limit)
{
if (len==0) return num0>=num1?1:0;
if (!limit && dp[len][num0][num1]!=-1) return dp[len][num0][num1];
int up=limit?a[len]:1;
int ans=0,p=lead?0:1;
ans+=dfs(len-1,num0+p,num1,lead,limit && up==0);
if (up==1) ans+=dfs(len-1,num0,num1+1,false,limit && up==1);
if (!limit) dp[len][num0][num1]=ans;
return ans;
}
int solve(int x)
{
int len=0;
while (x)
{
a[++len]=x&1;
x>>=1;
}
return dfs(len,0,0,true,true);
}
int main()
{
memset(dp,-1,sizeof(dp));
int n,m;
while (scanf("%d%d",&n,&m)!=EOF)
printf("%d\n",solve(m)-solve(n-1));
return 0;
}