HDU2089 不要62 数位dp

匿名 (未验证) 提交于 2019-12-02 23:49:02

网址:https://vjudge.net/problem/HDU-2089

题意:

从给定的范围中求出有几个数的序列中不包括$‘4’$和$‘62’$。

题解:

数位dp板子题,看注释。

AC代码:

#include <bits/stdc++.h> using namespace std; int dp[20][2];//第i是j的情况 int a[20]; int dfs(int pos,int pre,bool lim,bool tag)//这一位的数字,上一位数字,上限,6的标记 {     if(pos==-1)//已经到尽头了         return 1;     if(!lim&&dp[pos][tag]!=-1)//记忆化搜索,一定要判断是否有边界,有边界时计算不存在情况。         return dp[pos][tag];     int res=lim?a[pos]:9;//设置边界     int ans=0;     for(int i=0;i<=res;++i)     {         if(i==4||(i==2&&pre==6))             continue;         ans+=dfs(pos-1,i,lim&&i==a[pos],i==6);//有边界且i到达了边界,下一位也才有边界     }     if(!lim)         dp[pos][tag]=ans;//记录     return ans; } int solve(int num) {     memset(a,0,sizeof(a));               int pos=0;     while(num)     {         a[pos++]=num%10;         num/=10;     }     return dfs(pos-1,0,true,0);//刚开始的时候一定有边界 } int main() {     int n,m;     while(cin>>n>>m&&n+m)     {         memset(dp,-1,sizeof(dp));         cout<<solve(m)-solve(n-1)<<endl;     }     return 0; } 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!