标签:style blog class c code java
#include<stdio.h> #include<string.h> #include<math.h> #define max 10 int dp[max][3]; int number[max]; //dp[i][0] 前i位数中不符合要求的总个数 //dp[i][1] 前i位数中最高位是2的个数 //dp[i][2] 前i位数中存在含4和有连续62的个数 void init() { memset(dp,0,sizeof(dp)); dp[0][0]=1; for(int i=1;i<max;i++) { dp[i][0]=dp[i-1][0]*9-dp[i-1][1]; //除了4 并不含6+2..的 dp[i][1]=dp[i-1][0]; //2+, dp[i][2]=dp[i-1][2]*10+dp[i-1][0]+dp[i-1][1]; } } int len_num(int num) { int i=0; memset(number,0,sizeof(number)); while(num) { ++i; number[i]=num%10; num/=10; } return i; } int solve(int num) { int i,flag=0,count=0; int len=len_num(num); number[len+1]=0; for(i=len;i>0;i--) { count+=dp[i-1][2]*number[i]; if(flag) { count+=dp[i-1][0]*number[i]; } else { if(number[i]>4) count+=dp[i-1][0]; if(number[i]>6) count+=dp[i-1][1]; if(number[i]>2&&number[i+1]==6) count+=dp[i][1];//等于62是这个本身不用算在里面 只有大于2才会完全计算 if((number[i]==2&&number[i+1]==6)||number[i]==4) flag=1; } } return num-count; } int main(void) { init(); int n,m,i,j; while(scanf("%d%d",&n,&m)&&n&&m) { printf("%d\n",solve(m+1)-solve(n)); } return 0; }
hud 2089 不要62 (数位dp),布布扣,bubuko.com
标签:style blog class c code java
原文地址:http://www.cnblogs.com/woshijishu3/p/3737570.html