数位DP模板TLE求助
查看原帖
数位DP模板TLE求助
227728
冰糖鸽子TJ鸽子协会楼主2021/7/1 10:32

RT。。。70感觉和暴力一个分了。

#include <bits/stdc++.h>
using namespace std;
#define M 105
#define int long long
int n,m,g[M],h[M],L,f[M][M];
int Sol(int now,int k,int s1,int s0,int lst)
//now表示现在到了第i位,k为前面是不是全顶格了11
//s1表示现在有s1个1,s0表示现在有s0个1,lst表示第一个1前面有多少个前导零
{
	if(now>L) return ((s0-lst)>=s1); if(!k&&!lst&&f[now][s1-s0+M-50]!=-1) return f[now][s1-s0+M-50];
	int H=(k?h[now]:1),res=0;
	for(int i=0;i<=H;i++)
	{
		res+=Sol(now+1,k&&(i==H),s1+i,s0+(!i),((s1+i)==0?lst+1:lst));
	}
	if(!k&&!lst) f[now][s1-s0+M-50]=res;
	return res;
	/*
	[1][0][0][0]
	1 1 0 0 0  1
	*/
}
signed Get(int y)
{
	L=0;memset(h,0,sizeof(h));memset(f,-1,sizeof(f));//初始化
	while(y) h[++L]=y%2,y>>=1;reverse(h+1,h+1+L);//转二进制
	// for(int i=1;i<=L;i++) cout<<h[i]; cout<<endl;
	return Sol(1,1,0,0,0);
}
int main()
{
	cin>>n>>m;
	cout<<Get(m)-Get(n-1);
	return 0;
}
2021/7/1 10:32
加载中...