数位dp

那年仲夏 提交于 2019-12-28 14:23:33

不要62
学习于数位dp总结 之 从入门到模板
里面的介绍中dfs函数有一个pre参数,可以省略。
题目的要求就是一个范围内的数不含4和62的数的个数,两道基础题。

#include<stdio.h>
#include<string.h>
int a[20],dp[20][2];
int dfs(int pos,int sta,int flag){//分别存的第几位,上一位是否是6,是否达到上界 
	if(pos==-1) return 1;
	if(!flag&&dp[pos][sta]!=-1) return dp[pos][sta];
	int up=flag?a[pos]:9;//没达到上界就可以从0到9,达到上界他就是不完整的 
	int i,sum=0;
	for(i=0;i<=up;i++){
		if(i!=4&&!(sta&&i==2))
			sum+=dfs(pos-1,i==6,flag&&i==a[pos]);
	}
	if(!flag) dp[pos][sta]=sum;//没达到上界才可记录 
	return sum;
}
int solve(int n){
	int c=0;
	while(n){
		a[c++]=n%10;
		n/=10;
	}
	return dfs(c-1,0,1);
}
int main()
{
	int n,m;
	while(~scanf("%d %d",&m,&n)&&(m&&n)){
		memset(dp,-1,sizeof(dp));
		printf("%d\n",solve(n)-solve(m-1));
	}
	return 0;
}


Bomb

#include<stdio.h>
#include<string.h>
typedef long long ll;
ll a[25],dp[25][2];
ll dfs(int pos,int sta,int flag){
	if(pos==-1) return 1;
	if(!flag&&dp[pos][sta]!=-1) return dp[pos][sta];
	int up=flag?a[pos]:9;
	int i;
	ll sum=0;
	for(i=0;i<=up;i++){
		if(!(sta&&i==9))
			sum+=dfs(pos-1,i==4,flag&&i==a[pos]);
	}
	if(!flag) dp[pos][sta]=sum;
	return sum;
}
ll solve(ll x){
	int c=0;
	while(x){
		a[c++]=x%10;
		x/=10;
	}
	return dfs(c-1,0,1);
}
int main()
{
	int n;
	ll x;
	scanf("%d",&n);
	while(n--){
		scanf("%lld",&x);
		memset(dp,-1,sizeof(dp));
		printf("%lld\n",x+1-solve(x));
	}
	return 0;
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!