hdu 2089 不要62 (数位dp)
题意:http://acm.hdu.edu.cn/showproblem.php?pid=2089
思路:首先初始化预处理dp[i][j] 及i位数当前位为j时 即 0到 i * 10^j 符合条件的数
然后求出 fun(r+1)-fun(l)
fun从大的位数开始计算
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int dp[20][20]; int a[20]; int init() { int i,j,k; //i : i位数 j:当前位为j k:后一位为 k memset(dp,0, sizeof (dp)); dp[0][0]=1; for (i=1;i<=7;i++) { for (j=0;j<10;j++) { for (k=0;k<10;k++) { if (j==4||(j==6&&k==2)) continue ; dp[i][j]+=dp[i-1][k]; } } } } int fun( int n) { int ans=0; int len=1; int i,j,k; while (n) { a[len++]=n%10; n/=10; } a[len]=0; for (i=len-1;i>=1;i--) { for (j=0;j<a[i];j++) { if (j==4||(a[i+1]==6&&j==2)) continue ; ans+=dp[i][j]; } if (a[i]==4||a[i+1]==6&&a[i]==2) break ; } return ans; } int main() { int l,r; int i,j,k; while (scanf( "%d%d" ,&l,&r)!=EOF) { if (l==0&&r==0) break ; init(); printf( "%d\n" ,fun(r+1)-fun(l)); } return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步