Hdu 3652 && Scu 3774 B-number 数位dp

文章目录

题意

中文题我就不说了.

题解

标准数位dp.
我们用 d p [ i ] [ j ] [ 0 / 1 ] [ 0 / 1 ] dp[i][j][0/1][0/1] 表示当前数字的位数是 i i 位,当前数字模 13 13 的余数是 j j ,是否已经出现过 13 13 ,最高位是否为 1 1 的数字总数.
然后用普通的数位 d p dp 即可通过此题.
谢谢大家.

#include<bits/stdc++.h> //Ithea Myse Valgulious
/*快读快写已被省略.*/
using namespace std;
int dp[20][25][2][2],bit[20],p;

int dfs(int now,int yu,int jd,int st,int lim){
/*当前位数,模13的余数,是否已经出现13,最高位是否为1,最高位是否有要求*/
if (!now) return !yu&&jd;
if (!lim&&~dp[now][yu][jd][st]) return dp[now][yu][jd][st];
int llx=0,i,da=lim?bit[now]:9;
for (i=0;i<=da;++i) llx+=dfs(now-1,(yu*10+i)%13,jd||st&&i==3,i==1,lim&&i==da);
return lim?llx:dp[now][yu][jd][st]=llx;
}

int solve(int n){
for (p=0;n;n/=10) bit[++p]=n%10;
return dfs(p,0,0,0,1);
}

int main(){
memset(dp,-1,sizeof dp);
for (int n;read(n);write(solve(n)),pl);
}

猜你喜欢

转载自blog.csdn.net/qq_31908675/article/details/82875721