By
yusijia
Updated:
这回出去参加比赛被高中生给虐了……比完后问了下旁边那队的高中生,J题要用什么算法,才知道原来还有按位dp这么吊的东西……
于是找了为大神的文章好好学了下这个思想……
http://blog.csdn.net/libin56842/article/details/9984857
hdu 2089
http://acm.hdu.edu.cn/showproblem.php?pid=2089
题目大意:
定义不幸运数字为4或有字串为62,找区间内的幸运数字
例如: 1 2 3 4 5 6 7 8 9 10 中4不是幸运数字
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 59 60
| #include <stdio.h> #include <string.h> #include <string.h> int dp[10][3];
void Init() { memset(dp,0,sizeof(dp)); int i; dp[0][0] = 1; for(i = 1; i<=6; i++) { dp[i][0] = dp[i-1][0]*9-dp[i-1][1]; dp[i][1] = dp[i-1][0]; dp[i][2] = dp[i-1][2]*10+dp[i-1][0]+dp[i-1][1]; } } int solve(int n) { int i,len = 0,tem = n,ans,flag,a[10]; while(n) { a[++len] = n%10; n/=10; } a[len+1] = ans = 0; flag = 0; for(i=len; i>=1; i--) { ans+=dp[i-1][2]*a[i]; if(flag) ans+=dp[i-1][0]*a[i]; if(!flag && a[i]>4) ans+=dp[i-1][0]; if(!flag && a[i+1]==6 && a[i]>2) ans+=dp[i][1]; if(!flag && a[i]>6) ans+=dp[i-1][1]; if(a[i]==4 || (a[i+1]==6&&a[i]==2)) flag = 1; } return tem-ans; } int main() { int l,r; Init(); while(~scanf("%d%d",&l,&r),l+r) { printf("%d\n",solve(r+1)-solve(l)); } return 0; }
|