hud 2089 不要62 (数位dp)
2014-05-19 20:01
357 查看
#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; }
相关文章推荐
- 【数位dp】hud 2089 不要62 hdu 3555 Bomb
- HDU 2089 不要62 (数位DP)
- hdu 2089 不要62(数位dp入门)
- hdu 2089 不要62 数位dp
- HDU 2089——不要62(数位DP)
- HDU 2089 不要62(数位DP入门)
- 【数位dp】HDU - 2089 不要62
- HDU 2089 不要62(数位DP入门+模板)
- 不要62 HDU - 2089 (经典数位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)