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 ...
随机推荐
- [翻译]纠正PostCSS的4大认识误区
市面上已经有很多的前端工具,再来引入新的前端工具,价值大不大?这主要取决于,它是否给开发人员提供了新的功能,是否值得花时间和精力去学习和使用? PostCSS出现时有一个很有趣的现象.像sass和le ...
- 实现ModelDriver接口的功能(转)
ModelDriver接口 来自com.opensymphony.xwork2.ModelDriven.是xwork-2.1.2-750.jar包的东西. 下面是源码: package com.ope ...
- 第八篇:Spark SQL Catalyst源码分析之UDF
/** Spark SQL源码分析系列文章*/ 在SQL的世界里,除了官方提供的常用的处理函数之外,一般都会提供可扩展的对外自定义函数接口,这已经成为一种事实的标准. 在前面Spark SQL源码分析 ...
- HDU5324 cqd分治
HDU5324 cqd分治 标签(空格分隔): 未分类 给你两个长度相同数列,求第一个不上升,第二个不下降的最长子序列长度. 这里要求的子序列对第一个和第二个来说是相同的.即如果你在第一个序列里选了第 ...
- tcpdump抓包笔记
抓取指定端口的数据包 并保存文件,用wireshark分析 tcpdump -Ans 4096 -i any port 8080 -w ../mpass.cap 抓取指定端口和指定ip的数据包 并保存 ...
- IE与DOM的事件监听
IE 事件监听 标准DOM不支持 注意几点: window.onload attachEvent detachEvent 标准DOM监听,ie不支持
- Testng中注释简介
1. @Before和@After 注释 这两个就比较多,一般用于在测试构件上.关于测试构件以后详细介绍,测试构件一般有测试之前的操作和测试运行之后的清除数据的操作. Before分类有@Before ...
- Delphi编码转换
1.Delphi 的 Utf-8 转换 - findumars - 博客园.html https://www.cnblogs.com/findumars/archive/2013/12/26/3492 ...
- mongo的集群部署
# MongoDB 集群部署 ## 关键词 * 集群 * 副本集 * 分片 ## MongoDB集群部署 >今天主要来说说Mongodb的三种集群方式的搭建Replica Set副本集 / Sh ...
- SpringSecurity——基于Spring、SpringMVC和MyBatis自定义SpringSecurity权限认证规则
本文转自:https://www.cnblogs.com/weilu2/p/springsecurity_custom_decision_metadata.html 本文在SpringMVC和MyBa ...