HDU 2089 不要62 数位DP

来源:互联网 发布:日本签证年薪十万知乎 编辑:程序博客网 时间:2024/06/08 01:09

题意:给出一个区间,求区间内满足不包含4和不含连续的62的数的个数。

dp[pos][state]表示当前第pos位,前一位是否是6的状态,这里state只需0和1两种状态就可以了,不是6的情况可视为同种,不会影响计数。


#include<iostream>#include<cstdio>#include<cstring>using namespace std;int a[20];int dp[20][2];int dfs(int pos,int pre,int state,bool limit){if(pos==0) return 1;if(!limit&&dp[pos][state]!=-1) return dp[pos][state];int res=0;int up=limit?a[pos]:9;for(int i=0;i<=up;i++){if(pre==6&&i==2) continue;if(i==4) continue;res+=dfs(pos-1,i,i==6,limit&&i==a[pos]);}if(!limit) dp[pos][state]=res;return res;}int solve(int x){int pos=0;while(x){a[++pos]=x%10;x/=10;}return dfs(pos,-1,0,true);}int main(){int l,r;while(scanf("%d%d",&l,&r)){memset(dp,-1,sizeof dp);if(l==0&&r==0) break;printf("%d\n",solve(r)-solve(l-1));}return 0;}


0 0
原创粉丝点击