HDU——B-number(数位DP)
来源:互联网 发布:财物软件属于erp吗 编辑:程序博客网 时间:2024/04/28 23:02
题目大意:
要找出1到n之间有多少个数含13,并且能被13整除
记忆化搜索:
dp[pos][pre][mod][statu],pos位数,pre前一位,mod余数,statu状态
有2个状态:含13,不含13
<span style="font-size:18px;"><strong>#include<iostream>#include<cstring>#include<cstdio>#include<algorithm>#include<vector>#include<queue>#include<deque>#include<stack>#include<map>#include<set>#include<cmath>#include<cstdlib>#include<cctype>#define inf 0x3f3f3f3f#define maxn 10000typedef long long LL;using namespace std;int dp[15][15][15][2];int n,pos,num[11];int dfs(int pos,int s,int pre,int z,int e){ if(pos==-1) return s==1&&!z; //含13并且能被13整除 if(!e&&dp[pos][pre][z][s]!=-1) return dp[pos][pre][z][s]; int end=e?num[pos]:9; int sum=0; for(int i=0;i<=end;i++){ int mod=(z*10+i)%13; if(pre==1&&i==3) sum+=dfs(pos-1,1,i,mod,e&&i==end); else sum+=dfs(pos-1,s,i,mod,e&&i==end); } return e?sum:dp[pos][pre][z][s]=sum;}void Init(int x){ pos=0; while(x){ num[pos++]=x%10; x/=10; } memset(dp,-1,sizeof dp);}int cal(int x){ Init(x); return dfs(pos-1,0,0,0,1);}int main(){ while(scanf("%d",&n)!=EOF){ printf("%d\n",cal(n)); } return 0;}</strong></span>
0 0
- HDU 3652——B-number(数位DP)
- HDU——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)
- 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)
- i18n
- spring_tld描述文件
- 初探C++ 类中enum关键字的使用
- 包含min函数的栈[数据结构]
- Java IO流分析整理
- HDU——B-number(数位DP)
- 4548 美素数
- GridView的时候用到FindControl()在TemplateField中发现总是Find不到
- Java基础知识——super关键字
- 形象理解Android四大组件
- Android开发环境搭建教程
- phpStorm 新建文件SVN不提交的解决办法
- 哪种PDF转换器转换效果好
- 关于favicon.ico的两三事