Acwing 1085. 不要62

Posted Jozky86

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Acwing 1085. 不要62相关的知识,希望对你有一定的参考价值。

Acwing 1085. 不要62

题意:

问[n,m]这些数中有多少数不包含4,且不包含连续的62

题解:

经典数位dp,分析过程以前的数位dp博客有写
Acwing 1082. 数字游戏

代码:

#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\\n",a,b);
typedef long long ll;
using namespace std;

inline int read(){
   int s=0,w=1;
   char ch=getchar();
   while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
   while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);
   return s*w;
}
const int maxn=20;
int f[maxn][maxn];
void init(){
	for(int i=0;i<=9;i++)
		if(i!=4)
			f[1][i]=1;
			
	for(int i=2;i<maxn;i++){
		for(int j=0;j<=9;j++){
			for(int k=0;k<=9;k++){
				if(j==6&&k==2)continue;
				if(j==4||k==4)continue;
				f[i][j]+=f[i-1][k];
			}
		}
	}
}
int solve(int x){
	if(!x)return 1;
	vector<int>vec;
	int tot=0;
	int last=0;
	while(x)vec.push_back(x%10),x/=10;
	
	for(int i=vec.size()-1;i>=0;i--){
		int n=vec[i];
		for(int j=0;j<n;j++){
			if(j==4)continue;
			if(last==6&&j==2)continue;
			tot+=f[i+1][j];
		}
		if(n==4)break;
		if(last==6&&n==2)break;

		last=n;
		if(!i)tot++;
	}
	return tot;
}
int main()
{
	int n,m;
	init();
	while(cin>>n>>m){
		if(n==0&&m==0)break;
		cout<<solve(m)-solve(n-1)<<endl;
	}
	return 0;
}

以上是关于Acwing 1085. 不要62的主要内容,如果未能解决你的问题,请参考以下文章

Acwing第 62 场周赛未完结

Acwing第 62 场周赛未完结

Acwing第 62 场周赛未完结

不要62

HDU 2089 不要62

HDU 2089 不要62(数位dp)