HDU 2089 不要62(數位dp)

不要62


數位不能有4和62,沒有4的話在枚舉的時候判斷一下,而對於62的話,涉及到兩位,當前一位是6或者不是6這兩種不同情況我們計數是不相同的,所以要用狀態來記錄不同的方案數。dp[pos][state]表示當前第pos位,前一位是否是6的狀態,這裏state只需要0和1兩種狀態就可以了。


代碼:

#include <bits/stdc++.h>
using namespace std;  

typedef long long ll;
  
int a[20];  
int dp[20][2];
  
int dfs(int pos,int pre,int state,bool limit)  
{  
    if(pos==-1) return 1;  
    if(!limit && dp[pos][state]!=-1) return dp[pos][state];  
    int up=limit ? a[pos] : 9;  
    int tmp=0;  
    for(int i=0;i<=up;i++)  
    {  
        if(pre==6 && i==2)continue;  
        if(i==4) continue;//都是保證枚舉合法性  
        tmp+=dfs(pos-1,i,i==6,limit && i==up);  
    }  
    if(!limit) dp[pos][state]=tmp;  
    return tmp;  
}
  
int solve(int x)  
{  
    int pos=0;  
    while(x)  
    {  
        a[pos++]=x%10;  
        x/=10;  
    }  
    return dfs(pos-1,-1,0,true);  
}  
int main()  
{  
    int le,ri;  
    memset(dp,-1,sizeof dp);//可優化  
    while(~scanf("%d%d",&le,&ri) && le+ri)  
    {  
        printf("%d\n",solve(ri)-solve(le-1));  
    }  
    return 0;  
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章