hdu 2089 不要62 (数位DP)
2013-10-17 20:57
381 查看
题意:给定一个区间[n,m],求n到m中没有“62”和“4”的数的个数。其中例如62548 ,412包含62 和4 所以是不合法的。
思路:设dp[i][j]表示i位数且开头为j的数中不包含“4”和“62"的数的个数,则可以得出dp[i][j]=dp[i][j]+dp[i-1][k],(0=<k<=9),则可以将0000000~9999999的数进行一下预处理。然后对n,m分别从高位开始统计,统计到比n的小的数字,算出[0,m)和[0,n)的合法个数,最后对m进行特殊判断即可,答案即为[0.m)-[0,n),如果m合法则答案加1.
代码如下:
思路:设dp[i][j]表示i位数且开头为j的数中不包含“4”和“62"的数的个数,则可以得出dp[i][j]=dp[i][j]+dp[i-1][k],(0=<k<=9),则可以将0000000~9999999的数进行一下预处理。然后对n,m分别从高位开始统计,统计到比n的小的数字,算出[0,m)和[0,n)的合法个数,最后对m进行特殊判断即可,答案即为[0.m)-[0,n),如果m合法则答案加1.
代码如下:
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int f[10][12]; int numn[10];//存储n的第i位的数字是几,从右往左存 int numm[10];//存储m的第i位的数字是几,从右往左存 int lenn;//n的位数 int lenm;//m的位数 int n,m; void work()//0000000~9999999的预处理 { memset(f,0,sizeof(f)); f[0][0]=1; for(int i=1;i<=7;i++) for(int j=0;j<=9;j++) for(int k=0;k<=9;k++) { if((j!=4)&&(!(j==6&&k==2))) { f[i][j]+=f[i-1][k]; } } } void solve(int n,int m)//对n,m进行分离每位上的数字 { lenn=0,lenm=0; while(n) { numn[++lenn]=n%10; n/=10; } while(m) { numm[++lenm]=m%10; m/=10; } } int check()//判断n是否合法 { for(int i=lenm;i>0;i--) { if(numm[i]==4) return 0; if((i<lenm)&&(numm[i+1]==6)&&(numm[i]==2)) return 0; } return 1; } int cal()//计算[n,m]中合法的个数 { int sum=0; int res=0; for(int i=lenn;i>0;i--) { for(int j=0;j<numn[i];j++) { if(j!=4) { if((i<lenn)&&(j==2)&&(numn[i+1]==6)) continue; sum+=f[i][j]; } } if(numn[i]==4) { break; } if((i<lenn)&&(numn[i+1]==6)&&(numn[i]==2)) { break; } } for(int i=lenm;i>0;i--) { for(int j=0;j<numm[i];j++) { if(j!=4) { if((i<lenm)&&(j==2)&&(numm[i+1]==6)) continue; res+=f[i][j]; } } if(numm[i]==4) { break; } if((i<lenm)&&(numm[i+1]==6)&&(numm[i]==2)) { break; } } return res-sum; } int main() { // freopen("in.txt","r",stdin); work(); while(scanf("%d%d",&n,&m),n||m) { solve(n,m); printf("%d\n",cal()+check()); } return 0; }
相关文章推荐
- hdu 2089 不要62 --- 数位dp
- hdu_2089_不要62(数位DP)
- HDU 2089 不要62 (数位DP)
- HDU 2089 不要62(数位DP)
- hdu 2089 不要62(数位dp)
- HDU 2089 不要62[数位dp]
- HDU 2089 不要62 [数位dp]
- hdu 2089 不要62 (数位DP)
- HDU 2089 不要62 (数位DP)
- hdu 2089 不要62 数位dp入门
- HDU 2089 不要62 (经典的数位dp)
- hdu 2089 不要62 数位DP
- HDU-2089 不要62 (数位DP)
- hdu 2089 不要62(数位DP)
- hdu_2089_不要62(数位DP)
- HDU 2089 不要62 (数位DP)
- hdu 2089 不要62 数位dp
- HDU 2089 数位dp 不要62
- 不要62 - HDU 2089 数位dp
- hdu 2089 不要62 【数位DP】