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 ...
随机推荐
- javaScript对象与JSON.stringfly(obj)
//接收json对象 var objJson = new Object(); var arr = new Array(); var obj1 = new Object(); obj1.age = 15 ...
- think in java
1.public private protected
- 在Linux Centos 7.2 上安装指定版本Docker。
相关资料链接: https://docs.docker.com/install/linux/docker-ce/centos/#install-docker-ce 先清空下“历史” yum remov ...
- .net 修改AD域中的密码
1.通过vs 2013 新建一个web站点(不是空项目),这个会带一下模板, 2.然后新建一个页面UpdatePassWord.aspx aspx页面内容: <%@ Page Title=&qu ...
- 安装mysql数据库中的技巧、错误排查
针对解压版本5.7.16(博主使用的这个版本.在某些低版本中部分命令失效) 一.安装.初始化data目录(解压版解压后没有data目录) 安装:配置path环境变量,然后管理员运行命令提示符cmd ...
- lucene介绍和存储介绍
全文检索基础 1. Windows系统中的有搜索功能:打开“我的电脑”,按“F3”就可以使用查找的功能,查找指定的文件或文件夹.搜索的范围是整个电脑中的文件资源. 2. 在BBS.BLOG.新闻等系统 ...
- 【转】R语言知识体系概览
摘要:R语言的知识体系并非语法这么简单,如果都不了R的全貌,何谈学好R语言呢.本文将展示介绍R语言的知识体系结构,并告诉读者如何才能高效地学习R语言. 最近遇到很多的程序员都想转行到数据分析,于是就开 ...
- SSM 框架搭建 idea环境
参考: https://www.cnblogs.com/toutou/p/ssm_springmvc.html https://www.cnblogs.com/toutou/p/ssm_springm ...
- Request库使用response.text返回乱码问题
我们日常使用Request库获取response.text,这种调用方式返回的text通常会有乱码显示: import requests res = requests.get("https: ...
- MS SQL2008执行大脚本文件时,提示“内存不足”的解决办法
问题描述: 当客户服务器不允许直接备份时,往往通过导出数据库脚本的方式来部署-还原数据库, 但是当数据库导出脚本很大,用Microsoft SQL Server Management Studio执行 ...