数位dp求助
查看原帖
数位dp求助
109640
微香玉烛暗楼主2021/9/10 22:16

dp格式能写出来,尝试写记忆化后发现死活改不对,也不知道错了。有没有人能帮忙看一下。 (编译运行输入后没有结果,也没有爆栈,就一直在那运行)

代码如下

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ri register int
#define int long long
using namespace std;
const int N=20;
int l,r,id,num[N],f[N][N];

inline int read () {
	int x=0,y=1; char c=getchar();
	while (c<'0'||c>'9') {if (c=='-') y=-1; c=getchar();}
	while (c>='0'&&c<='9') {x=(x<<3)+(x<<1)+(c-'0'); c=getchar();}
	return x*y;
}

int dfs (int now,int x,bool flag,bool lim) {
	int ans=0;
	if (now==0) return x;
	if (!lim&&(!flag)&&f[now][x]!=-1) return f[now][x];
	for (ri j=0; j<=lim?num[now]:9; j++) {
		bool book=flag&&(j==0);
		ans+=dfs(now-1,x+((!book)&&(j==id)),flag&&(j==0),(j==num[now])&&lim);
	}
	if ((!lim)&&(!flag)) f[now][x]=ans;
	return ans;
}

inline int work (int n,int m) {
	int cnt=0;
	memset(f,-1,sizeof f);
	while (n) {
		num[++cnt]=n%10; n/=10;
	}
	return dfs(cnt,0,1,1);
}

signed main () {
	l=read(); r=read();
	for (id=0; id<=9; id++) {
		printf("%lld ",work(r)-work(l-1));
	}
	return 0;
}
2021/9/10 22:16
加载中...