[HDU]2089不要62
http://acm.hdu.edu.cn/showproblem.php?pid=2089
這道題跟Bomb(http://www.cnblogs.com/sjy123/p/3247731.html)基本一樣,不過多了一個不要包含4的條件,因為數值的范圍不大,本來這道題完全可以暴力完成的,不過既然剛學了數位DP,就用一用吧。
------------------------------------------------分割線-------------------------------------------------
狀態轉移方程
dp[i][0]=dp[i-1][0]*9-dp[i-1][1]; ? ? ? ? ? ? ? ? ? ? ? ? ? ?//不含62和4
dp[i][1]=dp[i-1][0]; ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? //不含62和4,但2結尾
dp[i][2]=dp[i-1][2]*10+dp[i-1][1]+dp[i-1][0]; ? ? ? ? //含62和4
不解釋了,得出的過程了Bomb基本一樣
----------------------------------------------分割線------------------------------------------------
#include"stdio.h" #include"stdlib.h" #include"string.h" int dp[20][3]; int a[20]; int fun(int len) {int i,flag=0,sum=0,last=0; //last表示一輪的位,即這輪的高一位 for(i=len;i>=1;i--){ sum+=dp[i-1][2]*a[i]; if(flag) sum+=dp[i-1][0]*a[i]; if(!flag&&a[i]>6) //本輪最高位大于6,需要加上低一位以2開頭的數 sum+=dp[i-1][1];if(!flag&&last==6&&a[i]>2) //上一輪最高位等于6,要加上這輪的以2開頭的個數 sum+=dp[i][1];if(!flag&&a[i]>4) //本輪最高位大于4,所以上一輪不含的數,這輪加上去 sum+=dp[i-1][0];if((last==6&&a[i]==2)||a[i]==4)flag=1; last=a[i]; }return sum; } int main() {int i,len,n,m,sum1,sum2,sum,t;memset(dp,0,sizeof(dp)); //初始化 dp[0][0]=1;for(i=1;i<21;i++) //算出彼此關系,下面計算時,直接調用 { dp[i][0]=dp[i-1][0]*9-dp[i-1][1]; //不含62和4 dp[i][1]=dp[i-1][0]; //不含62和4,但2結尾 dp[i][2]=dp[i-1][2]*10+dp[i-1][1]+dp[i-1][0]; //含62和4 }while(scanf("%d%d",&n,&m)!=EOF){if(n==0&&m==0) break; sum1=0;t=m-n+1; //n到m區間的總個數 len=0; memset(a,0,sizeof(a));while(n){a[++len]=n%10;n=n/10;}a[len+1]=0;sum1=fun(len);sum2=0;len=0; memset(a,0,sizeof(a));m++;while(m){a[++len]=m%10;m=m/10;}a[len+1]=0;sum2=fun(len);printf("%d\n",t-(sum2-sum1));}// system("pause"); }這面是暴力的作法,百度的。
#include<iostream> #include<stdio.h> using namespace std; int a[1000001]; int main() { int n,m; a[0]=1; int i; for(i=1;i<=1000000;i++) { if(i%10!=4&&i%100!=62&&a[i/10]==1) a[i]=1; else a[i]=0; } while(cin>>n>>m,n||m){ int count=0; for(int i=n;i<=m;i++) { if(a[i]==1) count++; } cout<<count<<endl; } } View Code?
?
轉載于:https://www.cnblogs.com/sjy123/p/3248217.html
總結
以上是生活随笔為你收集整理的[HDU]2089不要62的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python数据类型和循环控制
- 下一篇: BZOJ2561最小生成树——最小割