[数位dp] hdu 3652 B-number
来源:互联网 发布:java如何调用存储过程 编辑:程序博客网 时间:2024/05/22 18:21
题意:求含有13且能被13整除的数有多少个
思路:dp[i][j][k] i位,余数j,结果k k=0代表没有1也没有3,k=1代表前一位是1,k=2代表这之前已经含有13了
代码:
#include"cstdlib"#include"cstdio"#include"cstring"#include"cmath"#include"queue"#include"algorithm"#include"iostream"#define eps 1e-8using namespace std;int dp[12][15][3],num[12],ten[12];int dfs(int site,int mod,int ok,int f){ if(site==0) { if(mod==0&&ok==2) return 1; return 0; } if(!f&&dp[site][mod][ok]!=-1) return dp[site][mod][ok]; int len=f?num[site]:9; int ans=0; for(int i=0;i<=len;i++) { int tep=((i*ten[site])+mod)%13; if(ok==2) ans+=dfs(site-1,tep,2,f&&i==len); else { if(i==1) ans+=dfs(site-1,tep,1,f&&i==len); else if(i==3&&ok==1) ans+=dfs(site-1,tep,2,f&&i==len); else ans+=dfs(site-1,tep,0,f&&i==len); } } if(!f) dp[site][mod][ok]=ans; return ans;}int solve(int x){ int cnt=0; while(x) { num[++cnt]=x%10; x/=10; } return dfs(cnt,0,0,1);}int main(){ int n; memset(dp,-1,sizeof(dp)); ten[1]=1; for(int i=2;i<=10;i++) ten[i]=ten[i-1]*10; while(scanf("%d",&n)!=-1) { printf("%d\n",solve(n)); } return 0;}
0 0
- HDU 3652--B-number(数位dp)
- HDU 3652 B-number(数位DP)
- [HDU 3652]B-number[数位DP]
- hdu 3652 B-number (数位DP)
- hdu 3652 B-number(数位DP)
- HDU:3652 B-number(数位DP)
- HDU-3652 B-number 数位DP
- HDU 3652 B-number(数位dp模版)
- hdu 3652 B-number(数位dp)
- [数位dp] hdu 3652 B-number
- 【HDU】3652 B-number 数位DP
- hdu 3652 B-number(数位dp)
- HDU 3652 B-number (数位DP)
- HDU 3652 B-number(数位DP)
- HDU 3652 B-number(数位DP)
- hdu 3652 B-number (数位DP)
- 【数位DP】 HDU 3652 B-number
- HDU 3652 B-number(数位DP)
- Android 沉浸式全屏
- Powers of Ten – Part II
- Yii Framework中截取字符串(UTF-8)的源码
- 获取 Android 设备上当前运行的应用的 apk
- 关于MFC CEdit中仅输入数字时,如何使其不能输入以0开头的非0整数
- [数位dp] hdu 3652 B-number
- 将sharepoint 2013 网站集由基于路径命名转换到基于主机命名
- 在eclipse中集成java反编译工具
- java反序列化时的类加载
- 一种较为严谨的编程风格
- AngularJS入门(二)
- 12 屏幕绘图基础
- 简单的线程池
- lua乱斗