Acwing 1085. 不要62
Posted Jozky86
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的主要内容,如果未能解决你的问题,请参考以下文章