【数位DP】HDU3652[B-number]题解
2017-11-03 20:33
405 查看
题目概述
求 [1,n] 中含有 13 且是 13 的倍数的数的个数。解题报告
因为在复习,所以水博客就做了一下。常用套路,定义 f[i][j][k] 表示放了 i 位余数( mod 13 )为 j 状态为 k 的方案数( 0 :没有 13 ; 1 :没有 13 ,目前高位是 1 ; 2 :有 13 ),然后直接记忆化DFS就行了。
示例程序
#include<cstdio> #include<cstring> using namespace std; const int maxn=10,MOD=13; int n,a[maxn+5],f[maxn+5][MOD][3]; inline int getk(int k,int j) {if (k==2||k==1&&j==3) return 2;return j==1;} int Solve(int i,int j,int k,bool fl) { if (!i) return !j&&k==2;if (!fl&&~f[i][j][k]) return f[i][j][k]; int MAX,ans=0;if (fl) MAX=a[i]; else MAX=9; for (int t=0;t<=MAX;t++) ans+=Solve(i-1,(j*10+t)%13,getk(k,t),fl&&t==MAX); if (!fl) f[i][j][k]=ans;return ans; } int main() { freopen("program.in","r",stdin); freopen("program.out","w",stdout); memset(f,255,sizeof(f)); while (~scanf("%d",&n)) { a[0]=0;do a[++a[0]]=n%10,n/=10; while (n); printf("%d\n",Solve(a[0],0,0,true)); } return 0; }
相关文章推荐
- hdu3652B-number(数位dp)
- HDU3652 B-number 数位DP
- hdu3652 A-B number 数位DP
- HDU3652 B-number [数位DP]
- HDU3652:B-number(数位dp + 同余)
- [暑假集训--数位dp]hdu3652 B-number
- [hdu3652]B-number(数位dp)
- HDU3652 B-number(数位dp 深搜版本)
- hdu3652 B-number(数位DP)
- hdu3652 B-number(数位dp+dfs)
- 【数位DP】 hdu3652 B-number
- hdu3652 B-number 数位dp
- hdu3652 B-number 数位dp
- hdu3652 B-number 数位dp
- HDU3652:B-number(数位DP)
- [hdu3652][B-number] (数位dp)
- Hdu3652B-number数位dp
- hdu3652 B-number(数位dp)
- HDU3652 B-number(数位DP)
- HDU3652_B-number_数位DP&记忆化搜索