HDU 数位dp
模板http://www.cnblogs.com/jffifa/archive/2012/08/17/2644847.html
完全理解以后,我发现这种写法实在是太厉害了,简洁,优美,可以回避很多细节问题,而这些细节如果用递推的方法写,处理起来可能会非常痛苦
http://acm.hdu.edu.cn/showproblem.php?pid=2089
不要62
http://www.cnblogs.com/xiaohongmao/p/3473599.html
前几天写过这道题的解题报告,两种解法都有
http://acm.hdu.edu.cn/showproblem.php?pid=3555
不要49
#include <iostream>
using namespace std ;
typedef __int64 ll ;
ll dp[][] ;
int digit[] ;
ll dfs(int i,int s,bool e)
{
if(!i)return ;
if(!e && dp[i][s]!=-)
return dp[i][s] ;
ll res= ;
int u=e?digit[i]: ;
for(int d= ;d<=u ;d++)
{
if(s && d==)
continue ;
res+=dfs(i-,d==,e&&d==u) ;
}
return e?res:dp[i][s]=res ;
}
int callen(ll n)
{
int cnt= ;
while(n)
{
cnt++ ;
n/= ;
}
return cnt ;
}
void caldigit(ll n,int len)
{
memset(digit,,sizeof(digit)) ;
for(int i= ;i<=len ;i++)
{
digit[i]=n% ;
n/= ;
}
}
ll solve(ll n)
{
int len=callen(n) ;
caldigit(n,len) ;
return dfs(len,,) ;
}
int main()
{
int t ;
scanf("%d",&t) ;
memset(dp,-,sizeof(dp)) ;
while(t--)
{
ll n ;
scanf("%I64d",&n) ;
printf("%I64d\n",n+-solve(n)) ;
}
return ;
}
http://acm.hdu.edu.cn/showproblem.php?pid=3652
出现13且是13的倍数
#include <iostream>
using namespace std ;
int dp[][][][] ;//当前位数 被13除的余数 是否包括13 最末一位数
int digit[] ;
int dfs(int i,int re,bool flag,int last,bool e)
{
if(!i)return !re && flag ;
if(!e && dp[i][re][flag][last]!=-)
return dp[i][re][flag][last] ;
int res= ;
int u=e?digit[i]: ;
for(int d= ;d<=u ;d++)
res+=dfs(i-,(re*+d)%,flag || (last== && d==),d,e && d==u) ;
return e?res:dp[i][re][flag][last]=res ;
}
int callen(int n)
{
int cnt= ;
while(n)
{
cnt++ ;
n/= ;
}
return cnt ;
}
void caldigit(int n,int len)
{
for(int i= ;i<=len ;i++)
{
digit[i]=n% ;
n/= ;
}
}
int solve(int n)
{
int len=callen(n) ;
caldigit(n,len) ;
return dfs(len,,,,) ;
}
int main()
{
int n ;
memset(dp,-,sizeof(dp)) ;
while(~scanf("%d",&n))
{
printf("%d\n",solve(n)) ;
}
return ;
}
http://acm.hdu.edu.cn/showproblem.php?pid=4389
和上一题很像,要求x整除f(x),由于f(x)范围较小,枚举f(x)就好,注意的地方是有点卡内存,数组要开的比较合适才能过,习惯性开大点会MLE
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std ;
int digit[] ;
int dp[][][][] ;
int w ;
int dfs(int i,int s,int mod,int e)
{
if(!i)return !mod && s==w ;
if(!e && dp[i][s][mod][w]!=-)return dp[i][s][mod][w] ;
int u=e?digit[i]: ;
int res= ;
for(int d= ;d<=u ;d++)
res+=dfs(i-,s+d,(mod*+d)%w,e && d==u) ;
return e?res:dp[i][s][mod][w]=res ;
}
int callen(int n)
{
int cnt= ;
while(n)
{
cnt++ ;
n/= ;
}
return cnt ;
}
void caldigit(int n,int len)
{
memset(digit,,sizeof(digit)) ;
for(int i= ;i<=len ;i++)
{
digit[i]=n% ;
n/= ;
}
}
int solve(int n)
{
int len=callen(n) ;
caldigit(n,len) ;
int ans= ;
for(w= ;w< ;w++)
ans+=dfs(len,,,) ;
return ans ;
}
int main()
{
memset(dp,-,sizeof(dp)) ;
int t ;
scanf("%d",&t) ;
for(int cas= ;cas<=t ;cas++)
{
int l,r ;
scanf("%d%d",&l,&r) ;
printf("Case %d: %d\n",cas,solve(r)-solve(l-)) ;
}
return ;
}
http://acm.hdu.edu.cn/showproblem.php?pid=3709
枚举平衡位置
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std ;
typedef __int64 ll ;
int digit[] ;
ll dp[][][] ;
int w ;
ll dfs(int i,int s,int e)
{
if(!i)return !s ;
if(!e && dp[i][w][s]!=-)return dp[i][w][s] ;
int u=e?digit[i]: ;
ll res= ;
for(int d= ;d<=u ;d++)
res+=dfs(i-,s+d*(i-w),e && d==u) ;
return e?res:dp[i][w][s]=res ;
}
int callen(ll n)
{
int cnt= ;
while(n)
{
cnt++ ;
n/= ;
}
return cnt ;
}
void caldigit(ll n,int len)
{
memset(digit,,sizeof(digit)) ;
for(int i= ;i<=len ;i++)
{
digit[i]=n% ;
n/= ;
}
}
ll solve(ll n)
{
int len=callen(n) ;
caldigit(n,len) ;
ll ans= ;
for(w= ;w<=len ;w++)
ans+=dfs(len,,) ;
return ans-len+ ;
}
int main()
{
memset(dp,-,sizeof(dp)) ;
int t ;
scanf("%d",&t) ;
while(t--)
{
ll l,r ;
scanf("%I64d%I64d",&l,&r) ;
printf("%I64d\n",solve(r)-solve(l-)) ;
}
return ;
}
http://acm.hdu.edu.cn/showproblem.php?pid=4722
和4389一样,不过除数只有10一个,更简单
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std ;
typedef __int64 ll ;
int digit[] ;
ll dp[][][] ;
ll dfs(int i,int s,int mod,int e)
{
if(!i)return !mod ;
if(!e && dp[i][s][mod]!=-)return dp[i][s][mod] ;
int u=e?digit[i]: ;
ll res= ;
for(int d= ;d<=u ;d++)
res+=dfs(i-,s+d,(mod+d)%,e && d==u) ;
return e?res:dp[i][s][mod]=res ;
}
int callen(ll n)
{
int cnt= ;
while(n)
{
cnt++ ;
n/= ;
}
return cnt ;
}
void caldigit(ll n,int len)
{
memset(digit,,sizeof(digit)) ;
for(int i= ;i<=len ;i++)
{
digit[i]=n% ;
n/= ;
}
}
ll solve(ll n)
{
int len=callen(n) ;
caldigit(n,len) ;
return dfs(len,,,) ;
}
int main()
{
memset(dp,-,sizeof(dp)) ;
int t ;
scanf("%d",&t) ;
for(int cas= ;cas<=t ;cas++)
{
ll l,r ;
scanf("%I64d%I64d",&l,&r) ;
printf("Case #%d: %I64d\n",cas,solve(r)-solve(l-)) ;
}
return ;
}
HDU 数位dp的更多相关文章
- 数位DP+其他
参考资料: [1]:数位dp总结 之 从入门到模板 [2]:浅谈数位DP 题目一览表 来源 考察知识点 A 4352 "XHXJ's LIS" hdu 数位DP+状压DP+LIS ...
- hdu 5898 odd-even number 数位DP
传送门:hdu 5898 odd-even number 思路:数位DP,套着数位DP的模板搞一发就可以了不过要注意前导0的处理,dp[pos][pre][status][ze] pos:当前处理的位 ...
- HDU 2089 简单数位dp
1.HDU 2089 不要62 简单数位dp 2.总结:看了题解才敲出来的,还是好弱.. #include<iostream> #include<cstring> #i ...
- HDU 4507 (鬼畜级别的数位DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4507 题目大意:求指定范围内与7不沾边的所有数的平方和.结果要mod 10^9+7(鬼畜の元凶) 解题 ...
- HDU(3555),数位DP
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others ...
- HDU(4734),数位DP
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4734 F(x) Time Limit: 1000/500 MS (Java/Others) ...
- HDU 3555 Bomb 数位dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) Mem ...
- HDU 5787 K-wolf Number (数位DP)
K-wolf Number 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5787 Description Alice thinks an integ ...
- 【HDU 5456】 Matches Puzzle Game (数位DP)
Matches Puzzle Game Problem Description As an exciting puzzle game for kids and girlfriends, the Mat ...
随机推荐
- let与const心智模型
let 与 const 心智模型: let与const分别是变量与常量的块级声明关键字: 其主要目的是为了约束开发者编写出逻辑更加清晰,阅读性更好的代码: 它们体现了JavaScript的" ...
- Finder Quick Menu FAQ
How to use Finder Quick Menur: 1. Start Finder Quick Menu.2. Open "System Preferences -> Ext ...
- Django安装及创建工程
Django MTV模型介绍 Django的MTV分别代表: Model(模型):负责业务对象与数据库的对象(ORM) Template(模版):负责如何把页面展示给用户 View(视图):负责业务逻 ...
- C#设计模式之控制反转即依赖注入-Spring.NET
主流的依赖注入方案:微软企业库中的Unity.Spring.NET.StructureMap.Ninject.Castle Windsor等等. 本章用简单的案例讲解 Spring.NET IOC-控 ...
- Pandas 高级应用 数据分析
深入pandas 数据处理 三个阶段 数据准备 数据转化 数据聚合 数据准备 加载 组装 合并 - pandas.merge() 拼接 - pandas.concat() 组合 - pandas.Da ...
- jQuery Ajax总结
jQuery对Ajax的操作进行了封装.jQuery中\(.ajax()属于最底层的方法,这个放在后面说,首先看看封装了\).ajax()的方法. load()方法 load()可以远程载入HTML并 ...
- swagger2 坑 记录
swagger2 只认 @RequestMapping 注解! 不认@RestController 注解 @RestController @RequestMapping(value = "/ ...
- python collections deque
collections是python的高级容器类库,包含了dict.truple之外的常用容器. 下面介绍常用的deque 1. deque是双端队列,可以从两端塞元素进去,也可以从两端取元素. 2. ...
- 机器学习 delay learning
计蒜之道总决赛考了机器学习,大多数人都不会所以现场学,然后我看了一些之后放弃了..采取了人力分析的办法,最后果然被学习能力碾压.. 不过机器学习看起来是很有趣的,也听别人说了很多,和别人聊了一些,如果 ...
- 《Django By Example》
<Django By Example>第六章 中文 翻译 (个人学习,渣翻) 书籍出处:https://www.packtpub.com/web-development/django-ex ...