HDU2089 不要62(数位DP)
作者:互联网
本题是数位DP的入门题,可以用来浅浅了解一下这种强大的计数类工具。
以下代码是采用记忆化递归的写法,效率很高。
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 using namespace std; 5 int a[20]; 6 int dp[20][2]; 7 8 int dfs(int pos,bool sta,bool limit){ 9 if(pos==0) return 1; 10 if(!limit&&dp[pos][sta]!=-1) return dp[pos][sta];//记忆化处理,直接返回 11 //没有限制且之前已经求解 12 int len=limit?a[pos]:9;//有限制,就是a[pos],没有限制就是9 13 int ans=0; 14 for(int i=0;i<=len;i++){ 15 if(sta&&i==2) continue;//含62就跳过 16 if(i==4) continue; 17 ans+=dfs(pos-1,i==6,limit&&i==len); 18 } 19 if(!limit) dp[pos][sta]=ans;//记忆化记录答案 20 return ans; 21 } 22 23 int solve(int x){ 24 int pos=0; 25 while(x){ 26 a[++pos]=x%10;//提取每一位 27 x/=10; 28 } 29 return dfs(pos,0,1);//如果不包括0,此处减1即可 30 //从高位到低位枚举 31 } 32 33 int main(){ 34 int a,b; 35 memset(dp,-1,sizeof(dp)); 36 while(~scanf("%d%d",&a,&b),a+b){ 37 printf("%d\n",solve(b)-solve(a-1));//前缀和思想 38 } 39 return 0; 40 }
标签:sta,int,HDU2089,pos,62,limit,DP,include,dp 来源: https://www.cnblogs.com/yhxnoerror/p/16409970.html