开始学习数位dp...一道昨天看过代码思想的题今天打了近两个小时..最后还是看了别人的代码找bug...(丢丢)
传说院赛要取消 ? ... 这么菜不出去丢人也好吧~
#include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<math.h> #include<queue> using namespace std; int n,m; /// 数位dp 含62与4不吉利 /// dp数组用来存 第i位 以j开头 的吉利数 int dp[11][11]; void init(){ memset(dp,0,sizeof(dp)); for(int i=0;i<=9;i++) dp[1][i]=1; dp[1][4]=0; for(int i=2;i<=7;i++) { for(int j=0;j<=9;j++) { for(int k=0;k<=9;k++) { if(j!=4&&!(j==6&&k==2)) dp[i][j]+=dp[i-1][k]; } } } } int cal(int x){ if(x==0) return 1; int A[11]; int z=0; while(x>0) { z++; A[z]=x%10; x/=10; } int ans=0; A[z+1]=0; for(int i=z;i>=1;i--) { for(int j=0;j<A[i];j++) { if(j!=4&&!(A[i+1]==6&&j==2)) ans+=dp[i][j]; } if((A[i+1]==6&&A[i]==2)||A[i]==4) break; } return ans; } int main(){ init(); while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0) break; printf("%d\n",cal(m+1)-cal(n)); } }