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 ...
随机推荐
- MYSQL数据库里面的所有密码批量MD5加密
如果你的字段够长度的话:UPDATE users SET password = MD5(password);如果长度不够,可以先增加长度后再做,或者多建一列,完成后删除原来的列!(如passwd)UP ...
- c#结构体和字节流之间的相互转换
结构体转byte数组 1 首先要明白 ,是 在那个命名空间下 System.Runtime.InteropServices; 2 首先得到结构体的大小 2 开辟相应的内存空间 3 将结构体填 ...
- mysql悲观锁以及乐观锁总结和实践
悲观锁介绍(百科): 悲观锁,正如其名,它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中, 将数据处于锁定状态.悲观锁的实现,往往 ...
- Hadoop 常用指令
1. 察看hdfs文件系统运行情况 bin/hdfs dfsadmin -report 2. 为了方便执行 HDFS 的操作指令,我们可以将需要的 Hadoop 路径写入环境变量中,便于直接执行命令. ...
- SPA(单页面web应用程序)
单页web应用(single page web application,SPA),就是只有一张web页面的应用,是加载单个HTML页面并在用户与应用程序交互时动态更新该页面的web应用程序. 浏览器一 ...
- nignx的master进程和worker进程的作用
ngnix进程启动启动后会有一个master进程和多个worker进程. master进程的主要作用: 1.读取并验证配置信息: 2.创建,绑定及关闭套接字: 3.启动,终止worker进程以及维护w ...
- 微信开发中使用curl忽略https证书
http://blog.csdn.net/ljh504429906/article/details/51103519 微信开发中需要使用http及https的post与get请求实现api的调用. ...
- 最新Dubbo-admin+Zookeeper搭建
Zookeeper搭建: 下载zookeeper压缩包并解压,下载地址:http://www.apache.org/dyn/closer.cgi/zookeeper/进入conf目录下将 zoo_sa ...
- Selenium入门练习(一)
自主学习---上海野生动物园之登录.订票.退票 Create了一个TestNG可以查看执行结果: package FristTestNG; import java.sql.Driver; import ...
- Java解析XML格式串(JDOM解析)
import java.io.IOException; import java.io.StringReader; import java.util.List; import org.jdom.Docu ...