标签:img std long contract 手机 block image indicator pen
感觉数位dp好恶心……
原题:
f[i][1][k][q][flag][1]+=(q<a[i])*f[i-1][0][j][k][p][1]+f[i-1][1][j][k][p][1];
f[i][1][k][q][flag][mark]+=(q<a[i])*f[i-1][0][j][k][p][0]+f[i-1][1][j][k][p][0];
恩再多我也解释不了了,只能意会
全程抄代码,感觉只是勉强理解了这题,并不能自己写出来
注意l=1e10的情况,减一下就不是11位了
代码:
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 using namespace std; 7 #define ll long long 8 ll n,m; 9 int a[20]; 10 ll f[12][2][10][10][4][2]; 11 int QAQ(int x,int y){ return ((x==8)<<1)|(x==4)|((y==8)<<1)|(y==4);} 12 ll play(ll x){ 13 memset(f,0,sizeof(f)); 14 for(int i=11;i>=1;--i) a[i]=x%10,x/=10; 15 int flg=QAQ(a[1],a[2]),mk=0; 16 f[2][0][a[1]][a[2]][flg][0]=1; 17 for(int i=1;i<=a[1];++i)for(int j=0;j<=9;++j){ 18 if(i==a[1] && j>=a[2]) continue; 19 f[2][1][i][j][QAQ(i,j)][0]=1; 20 } 21 for(int i=3;i<=11;++i){ 22 flg|=QAQ(a[i],a[i]),mk|=(a[i]==a[i-1] && a[i]==a[i-2]); 23 if(flg!=3) f[i][0][a[i-1]][a[i]][flg][mk]=1; 24 for(int j=0;j<=9;++j)for(int k=0;k<=9;++k)for(int p=0;p<=2;++p)for(int q=0;q<=9;++q){ 25 int flg1=p|QAQ(q,q),flg2=(q==k && k==j); 26 if(flg1==3) continue; 27 f[i][1][k][q][flg1][1]+=(q<a[i])*f[i-1][0][j][k][p][1]+f[i-1][1][j][k][p][1]; 28 f[i][1][k][q][flg1][flg2]+=(q<a[i])*f[i-1][0][j][k][p][0]+f[i-1][1][j][k][p][0]; 29 } 30 } 31 ll bwl=0; 32 for(int i=0;i<=9;++i)for(int j=0;j<=9;++j)for(int p=0;p<=2;++p)for(int q=0;q<=1;++q) 33 bwl+=f[11][q][i][j][p][1]; 34 return bwl; 35 } 36 int main(){//freopen("ddd.in","r",stdin); 37 cin>>n>>m; 38 if(n==10000000000LL){ cout<<play(m)<<endl; return 0;} 39 cout<<play(m)-play(n-1)<<endl; 40 return 0; 41 }
标签:img std long contract 手机 block image indicator pen
原文地址:http://www.cnblogs.com/JSL2018/p/6554682.html