hdu 3943 经典数位dp好题
/*
题意:求出p-q的第j个nya数
数位dp,求出p-q的所有nya数的个数很好求,但是询问求出最终那个第j个值时是我不会求了看了下别人的思路
具体就是把p-q的第j个转化成0-q的第low+j个(其中low为小于等于p的nya数)
枚举q的每一位数字,枚举位数值并进行比较直至求出每一位的值。
经典好题,长见识了。
*/
#include<stdio.h>
#include<string.h>
#define ll __int64
#define N 21
ll dp[N][N][N][2],x,y,ans;//多开一个ok加快速度,把所有解全存起来
ll digit[N],flen;//flen吧最终q的长度保存起来
ll dfs(ll len,ll sin,ll qin,ll ok) {
if(!len) {
if(sin==x&&qin==y)return 1;
return 0;
}
if(sin>x||qin>y)return 0;
if(dp[len][sin][qin][ok]!=-1)
return dp[len][sin][qin][ok];
ll ans=0,maxx=ok?digit[len]:9,i;
for(i=0;i<=maxx;i++)
ans+=dfs(len-1,sin+(i==4),qin+(i==7),ok&&i==maxx);
dp[len][sin][qin][ok]=ans;//把所有情况保存起来
return ans;
}
ll f(ll n) {
ll len=0;
memset(dp,-1,sizeof(dp));
while(n) {
digit[++len]=n%10;
n/=10;
}
flen=len;//在询问时会用到
return dfs(len,0,0,1);
}
void dfs_answer(ll len,ll sin,ll qin,ll ok,ll kth) {//不断的递归调用自身直至求出最终结果
ll cnt,maxx=ok?digit[len]:9,i;
for(i=0;i<=maxx;i++) {
cnt=dfs(len-1,sin+(i==4),qin+(i==7),ok&&i==maxx);
if(cnt<kth)
kth-=cnt;
else
break;
}
ans=ans*10+i;//说明当第len个数是i时存在结果,求出的是第len位的值
if(len!=1)
dfs_answer(len-1,sin+(i==4),qin+(i==7),ok&&i==maxx,kth);//不断递归调用本身,顶多调用20次,每次的时间复杂度为0(1),因为每次调用dfs时的结果都已经保存起来了
}
int main() {
ll t,m,n,j,k,kk=0,q,low,high;
scanf("%I64d",&t);
while(t--) {
scanf("%I64d%I64d%I64d%I64d",&n,&m,&x,&y);
low=f(n);//求出0-n的nya数个数
high=f(m);//求出0-m的nya数个数
k=high-low;//n-m之间的个数
scanf("%I64d",&q);
printf("Case #%I64d:\n",++kk);
while(q--) {
scanf("%I64d",&j);
if(j>k)
printf("Nya!\n");
else {
ans=0;
j+=low;//计算0-m的第j个nya数
dfs_answer(flen,0,0,1,j);
printf("%I64d\n",ans);
}
}
}
return 0;}
hdu 3943 经典数位dp好题的更多相关文章
- 【数位dp】【HDU 3555】【HDU 2089】数位DP入门题
[HDU 3555]原题直通车: 代码: // 31MS 900K 909 B G++ #include<iostream> #include<cstdio> #includ ...
- HDU 2089 不要62(数位dp模板题)
http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意:求区间内不包含4和连续62的数的个数. 思路: 简单的数位dp模板题.给大家推荐一个好的讲解博客.h ...
- Bomb HDU - 3555 (数位DP)
Bomb HDU - 3555 (数位DP) The counter-terrorists found a time bomb in the dust. But this time the terro ...
- HDU 2089 不要62 数位DP模板题
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 参考博客:https://www.cnblogs.com/HDUjackyan/p/914215 ...
- HDU 2089 - 不要62 - [数位DP][入门题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 Time Limit: 1000/1000 MS (Java/Others) Memory Li ...
- HDU - 3652 数位DP 套路题
题意:统计能被13整除和含有13的数的个数 解法没法好说的..学了前面两道直接啪出来了 PS.HDU深夜日常维护,没法交题,拿网上的代码随便对拍一下,输出一致 #include<bits/std ...
- HDU 2089 不要62【数位DP入门题】
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- hdu 2089 不要62 (数位dp基础题)
不要62 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submis ...
- HDU(4734),数位DP
题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=4734 F(x) Time Limit: 1000/500 MS (Java/Others) ...
随机推荐
- mysql配置mha高可用防火墙未关闭报错
########################################################################## l 问题背景:检查主从复制之后做高可用报错 [r ...
- Snort里的规则目录文件解读(图文详解)
不多说,直接上干货! snort的规则啊,是基于文本的,它通常存在于snort程序目录中或者子目录中,规则文件按照不同的组,进行分类存放的. snort的安装目录 [root@datatest sno ...
- Java中static修饰符
public class StaticTest { static int i ; static int m=30; int j ; int k=25; static{ i=10; System.out ...
- AJPFX编写cmd界面下一键编译、执行java代码的bat脚本
此脚本适合刚接触java的同学,在cmd界面下用jc取代 复杂的 javac *.java + java main使用说明:把脚本内容复制到txt文本中,修改后缀名为.bat,运行一次即可完成配置, ...
- 使用 Java 发送邮件
在我们的应用程序中有时需要给用户发送邮件,例如激活邮件.通知邮件等等.那么如何使用 Java 来给用户发送邮件呢? 使用 java 代码发送邮件 使用工具类发送邮件 使用Spring进行整合发送邮件 ...
- jQuery实现复选框的全选与全不选
对于复选框的选中checked属性,实在是无力吐槽. 从上图可以看出,当复选框不设置checked属性时,默认没有被选中:其它三种情况,设置checked属性但不设置属性值即置空,或者将checked ...
- Boost库编译安装
一.Boost库介绍 Boost库是一个经过千锤百炼.可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的发动机之一.Boost库由C++标准委员会库工作组成员发起,其 ...
- (转)淘淘商城系列——引用dubbo服务
http://blog.csdn.net/yerenyuan_pku/article/details/72758663 上文我们一起学习了如何发布一个dubbo服务,本文我就来教大家如何在web工程中 ...
- jQuery 全选、全不选、反选
<!DOCTYPE html> <html lang="en"> <head> <title></title> < ...
- Linux之基础命令——文件操作
ls(显示指定工作目录下的内容) -a 显示所有文件及目录 包括隐藏文件 -l 除文件名称外,还会将文件类型.权限.拥有者.文件大小等信息详细列出[可以ll简写] -r 将文件以相反次序显示(默认是a ...