刚写了两个数位dp的入门题: bomb和不要62
两个题都可以在各个评测网站上找到
直接贴代码了
bomb
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[20];
ll dp[20][2];
ll dfs(int len,bool judge4,bool limit)
{
if(len==0)
return 1;
if(!limit&&dp[len][judge4])
return dp[len][judge4];
ll cnt=0,up=(limit? a[len] : 9);
for(int i=0;i<=up;++i){
if(judge4&&i==9)
continue;
cnt+=dfs(len-1,i==4,limit&&i==up);
}
if(!limit)
dp[len][judge4]=cnt;
return cnt;
}
ll solve(ll num)
{
int k=0;
while(num){
a[++k]=num%10;
num/=10;
}
return dfs(k,false,true);
}
int main()
{
int t;
cin>>t;
while(t--){
ll n;
cin>>n;
cout<<n+1-solve(n)<<endl;
}
return 0;
}
不要62
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[20];
ll dp[20][2];
ll dfs(int len,bool judge6,bool limit)
{
if(len==0)
return 1;
if(!limit&&dp[len][judge6])
return dp[len][judge6];
ll cnt=0,up=(limit? a[len] : 9);
for(int i=0;i<=up;++i){
if(judge6&&i==2||i==4)
continue;
cnt+=dfs(len-1,i==6,limit&&i==up);
}
if(!limit)
dp[len][judge6]=cnt;
return cnt;
}
ll solve(ll num)
{
int k=0;
while(num){
a[++k]=num%10;
num/=10;
}
return dfs(k,false,true);
}
int main()
{
int n,m;
while(cin>>n>>m&&(n+m)){
cout<<solve(m)-solve(n-1)<<endl;
}
return 0;
}
两个题都是打板子的题,等会写一下windy数发上来
数位dp如果不太好理解可以找个视频看看