标签:
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089
排位赛补题的时候遇到数位dp根本不会,先找道简单的写写orz,过了都不知道怎么过的,反正先传上来orz
dp[i][j]表示位数为i,最高位为j时不含4和62的数的个数,学自百度文库:http://wenku.baidu.com/view/9de41d51168884868662d623.html
#include <iostream> #include <cstdio> #include <cstring> using namespace std; int f[10][12],digit[9]; void dp() { f[0][0]=1; for(int i=1; i<9; i++) for(int j=0; j<10; j++) for(int k=0; k<10; k++) { if((j==6&&k==2)||j==4) continue; f[i][j]+=f[i-1][k]; } } int solve(int n) { memset(digit,0,sizeof(digit)); int k=1; while(n) { digit[k++]=n%10; n/=10; } int ans=0; for(int i=k; i>=1; i--) { for(int j=0; j<digit[i]; j++) { if((j==2&&digit[i+1]==6)||j==4) continue; ans+=f[i][j]; } if(digit[i]==4||(digit[i]==2&&digit[i+1]==6))break; } return ans; } int main() { int m,n; dp(); while(scanf("%d%d",&n,&m)&&n&&m) { printf("%d\n",solve(m+1)-solve(n)); } return 0; }
标签:
原文地址:http://www.cnblogs.com/xuxueyang/p/4346665.html