模板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的更多相关文章

  1. 数位DP+其他

    参考资料: [1]:数位dp总结 之 从入门到模板 [2]:浅谈数位DP 题目一览表 来源 考察知识点 A 4352 "XHXJ's LIS" hdu 数位DP+状压DP+LIS ...

  2. hdu 5898 odd-even number 数位DP

    传送门:hdu 5898 odd-even number 思路:数位DP,套着数位DP的模板搞一发就可以了不过要注意前导0的处理,dp[pos][pre][status][ze] pos:当前处理的位 ...

  3. HDU 2089 简单数位dp

    1.HDU 2089  不要62    简单数位dp 2.总结:看了题解才敲出来的,还是好弱.. #include<iostream> #include<cstring> #i ...

  4. HDU 4507 (鬼畜级别的数位DP)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4507 题目大意:求指定范围内与7不沾边的所有数的平方和.结果要mod 10^9+7(鬼畜の元凶) 解题 ...

  5. HDU(3555),数位DP

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others ...

  6. HDU(4734),数位DP

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4734 F(x) Time Limit: 1000/500 MS (Java/Others) ...

  7. HDU 3555 Bomb 数位dp

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) Mem ...

  8. HDU 5787 K-wolf Number (数位DP)

    K-wolf Number 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5787 Description Alice thinks an integ ...

  9. 【HDU 5456】 Matches Puzzle Game (数位DP)

    Matches Puzzle Game Problem Description As an exciting puzzle game for kids and girlfriends, the Mat ...

随机推荐

  1. javaScript对象与JSON.stringfly(obj)

    //接收json对象 var objJson = new Object(); var arr = new Array(); var obj1 = new Object(); obj1.age = 15 ...

  2. think in java

    1.public private protected

  3. 在Linux Centos 7.2 上安装指定版本Docker。

    相关资料链接: https://docs.docker.com/install/linux/docker-ce/centos/#install-docker-ce 先清空下“历史” yum remov ...

  4. .net 修改AD域中的密码

    1.通过vs 2013 新建一个web站点(不是空项目),这个会带一下模板, 2.然后新建一个页面UpdatePassWord.aspx aspx页面内容: <%@ Page Title=&qu ...

  5. 安装mysql数据库中的技巧、错误排查

    针对解压版本5.7.16(博主使用的这个版本.在某些低版本中部分命令失效) 一.安装.初始化data目录(解压版解压后没有data目录) 安装:配置path环境变量,然后管理员运行命令提示符cmd   ...

  6. lucene介绍和存储介绍

    全文检索基础 1. Windows系统中的有搜索功能:打开“我的电脑”,按“F3”就可以使用查找的功能,查找指定的文件或文件夹.搜索的范围是整个电脑中的文件资源. 2. 在BBS.BLOG.新闻等系统 ...

  7. 【转】R语言知识体系概览

    摘要:R语言的知识体系并非语法这么简单,如果都不了R的全貌,何谈学好R语言呢.本文将展示介绍R语言的知识体系结构,并告诉读者如何才能高效地学习R语言. 最近遇到很多的程序员都想转行到数据分析,于是就开 ...

  8. SSM 框架搭建 idea环境

    参考: https://www.cnblogs.com/toutou/p/ssm_springmvc.html https://www.cnblogs.com/toutou/p/ssm_springm ...

  9. Request库使用response.text返回乱码问题

    我们日常使用Request库获取response.text,这种调用方式返回的text通常会有乱码显示: import requests res = requests.get("https: ...

  10. MS SQL2008执行大脚本文件时,提示“内存不足”的解决办法

    问题描述: 当客户服务器不允许直接备份时,往往通过导出数据库脚本的方式来部署-还原数据库, 但是当数据库导出脚本很大,用Microsoft SQL Server Management Studio执行 ...