hdu 3652数位dp
/*
数位dp
题意:找到1-n之间包括13这个子串而且可以整除13的数
解:刚開始dp[N][N][2]这里的2用来记录是否为13表示当前位是否为13,我把上一位为1当前位为13和上一位部位1
这样的情况在数组中没有记录。
*/
#include<stdio.h>
#include<string.h>
#define N 14
int dp[N][N][3];
int digit[N];
int dfs(int len,int mod,int cnt,int ok) {
if(!len) {
if(mod==0&&cnt==2)return 1;
return 0;
}
if(!ok&&dp[len][mod][cnt]!=-1)
return dp[len][mod][cnt];
int ans=0,i,maxx=ok? digit[len]:9;
for(i=0;i<=maxx;i++) {
if(cnt==2||(cnt==1&&i==3))
ans+=dfs(len-1,(mod*10+i)%13,2,ok&&i==maxx);
else
if(i==1)//刚開始这里推断条件写成if(cnt==0&&i==1)这样是不正确的由于漏掉了一种情况(i==1&&cnt==1)
ans+=dfs(len-1,(mod*10+i)%13,1,ok&&i==maxx);
else
ans+=dfs(len-1,(mod*10+i)%13,0,ok&&i==maxx);
}
if(!ok)
dp[len][mod][cnt]=ans;
return ans;
}
int f(int n) {
int len=0;
while(n) {
digit[++len]=n%10;
n/=10;
}
return dfs(len,0,0,1);
}
int main() {
int n;
memset(dp,-1,sizeof(dp));
while(scanf("%d",&n)!=EOF) {
printf("%d\n",f(n));
}
return 0;}
<pre name="code" class="cpp">/*
我原来的思路,刚開始写的时候少开了一维记录pre的情况
*/
#include<stdio.h>
#include<string.h>
#define N 14
int dp[N][N][2][2];
int digit[N];
int dfs(int len,int mod,int pre,int cnt,int ok) {
if(!len) {
if(mod==0&&cnt==1)return 1;
return 0;
}
if(!ok&&dp[len][mod][pre][cnt]!=-1)
return dp[len][mod][pre][cnt];
int ans=0,i,maxx=ok? digit[len]:9;
for(i=0;i<=maxx;i++) {
if(cnt||(pre&&i==3))
ans+=dfs(len-1,(mod*10+i)%13,i==1,1,ok&&i==maxx);
else
ans+=dfs(len-1,(mod*10+i)%13,i==1,0,ok&&i==maxx);
}
if(!ok)
dp[len][mod][pre][cnt]=ans;
return ans;
}
int f(int n) {
int len=0;
while(n) {
digit[++len]=n%10;
n/=10;
}
return dfs(len,0,0,0,1);
}
int main() {
int n;
memset(dp,-1,sizeof(dp));
while(scanf("%d",&n)!=EOF) {
printf("%d\n",f(n));
}
return 0;}
hdu 3652数位dp的更多相关文章
- HDU 3652(数位DP)
题目链接:B-number Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- [hdu 3652]数位dp解决数的倍数问题
原以为很好的理解了数位dp,结果遇到一个新的问题还是不会分析,真的是要多积累啊. 解决13的倍数,可以根据当前余数来推,所以把当前余数记为一个状态就可以了. #include<bits/stdc ...
- HDU - 3652 数位DP 套路题
题意:统计能被13整除和含有13的数的个数 解法没法好说的..学了前面两道直接啪出来了 PS.HDU深夜日常维护,没法交题,拿网上的代码随便对拍一下,输出一致 #include<bits/std ...
- hdu 4507 数位dp(求和,求平方和)
http://acm.hdu.edu.cn/showproblem.php?pid=4507 Problem Description 单身! 依旧单身! 吉哥依旧单身! DS级码农吉哥依旧单身! 所以 ...
- hdu 4352 数位dp + 状态压缩
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- 2017中国大学生程序设计竞赛 - 网络选拔赛 HDU 6156 数位DP
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6156 题意:如题. 解法:数位DP,暴力枚举进制之后,就转化成了求L,R区间的回文数的个数,这个直接做 ...
- hdu:2089 ( 数位dp入门+模板)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 数位dp的模板题,统计一个区间内不含62的数字个数和不含4的数字个数,直接拿数位dp的板子敲就行 ...
- HDU 4352 XHXJ's LIS HDU(数位DP)
HDU 4352 XHXJ's LIS HDU 题目大意 给你L到R区间,和一个数字K,然后让你求L到R区间之内满足最长上升子序列长度为K的数字有多少个 solution 简洁明了的题意总是让人无从下 ...
- hdu 3709 数位dp
数位dp,有了进一步的了解,模板也可以优化一下了 题意:找出区间内平衡数的个数,所谓的平衡数,就是以这个数字的某一位为支点,另外两边的数字大小乘以力矩之和相等,即为平衡数例如4139,以3为支点4*2 ...
随机推荐
- 【Todo】Boost安装与学习
现在这里找下载包 http://sourceforge.net/projects/boost 我找的是 1_62_0 下面是从公司wiki上找到的一个说明. boost & thrift安装步 ...
- python中常用的推导(字典推导和列表推导)
在python开发中经常需要书写这样的代码 result = list() for data in datas: if data not in ['a', 'b']: result.append(da ...
- 流畅的python第十八章使用asyncio包处理并发
对比一个简单的多线程程序和对应的 asyncio 版,说明多线程和异步任务之间的关系asyncio.Future 类与 concurrent.futures.Future 类之间的区别摒弃线程或进程, ...
- 2017.12.27 sqlSessionFactory和sqlSession(to be continued)
参考来自:<深入浅出MyBatis技术原理与实践-第6章 > 1.SqlSessionFactory SqlSessionFactory是一个接口,最重要的功能是提供SqlSession. ...
- XAMPP + Xdebug+Zend Studio
建立php开发环境(XAMPP + Xdebug+Zend Studio) 大家知道,运行php可以在apache上运行,但是要在apache上配置php解释器模块,懒得麻烦.就用XAMPP吧,它已经 ...
- jQuery选取表单元素
表单元素选择器 选择器 说明 :button <button>元素和type属性值为button的<input& ...
- 云计算之路-阿里云上-新发现:又一种与虚拟内存有关的CPU波动情况
在云上真是无奇不有,昨天偶然间发现在IIS的应用程序池回收设置中,仅仅设置了一下基于虚拟内存限制的回收,就引发了CPU有规律的波动.在这篇博文中,我们将向大家汇报一下云计算之路上的这个小发现. 在之前 ...
- poj 2253 (dis最短路径)
Frogger Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 24979 Accepted: 8114 Descript ...
- CCF-201512-3 绘图
问题描写叙述 用 ASCII 字符来绘图是一件有趣的事情.并形成了一门被称为 ASCII Art 的艺术.比如,下图是用 ASCII 字符画出来的 CSPRO 字样. .._._.._.._-_.. ...
- SugarCE问题点记录
问:如何获取module参数?如果module参数不存在,如何处理?答:首先检查$_REQUEST['module'],然后再检查$sugar_config['default_module']是否有设 ...