POJ3208魔鬼数
题目:http://poj.org/problem?id=3208
与一般的数位dp有点不同的是,没有给出上界,而是要通过值来判断这一位该填什么。
当然是从高位向低位填。
为了知道这一位填下去对答案有什么影响,需要预处理出后面无限制的魔鬼数个数。
预处理魔鬼数最重要的是不重不漏。这一位的魔鬼数=上一位的所有魔鬼数+这一位填6带来的新魔鬼数。
新魔鬼数不能与上一位已有的魔鬼数重复,所以需要记录“开头有2个6的非魔鬼数”。
为了得到这个,递推需要记录“开头有1个6的非魔鬼数”和“开头有0个6的非魔鬼数”。
f [ i ][ 0 ]=9*f [ i-1 ][ 0 ]+9*f [ i-1 ][ 1 ]+9*f [ i-1 ][ 2 ]; //不填6
f [ i ][ 1 ]=f [ i-1 ][ 0 ]; f [ i ][ 2 ]=f [ i-1 ][ 1 ]; f [ i ][ 3 ]=f [ i-1 ][ 2 ]; //填6
代码中n-=cnt意思是这一位越过这个j之后,当前累计魔鬼数数量就多了cnt个。就像普通数位dp一样。
看了蓝皮书上的精美写法!竟然可以用一句for给m赋值!l 的循环也写的很好!
dp的初值是自己不熟的地方。
别忘了输出当前位之后要break。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int LM=;
int n,m,k,t;
long long f[LM+][];
void pre()
{
f[][]=;//
for(int i=;i<LM;i++)
{
for(int j=;j<;j++)
{
f[i+][j+]+=f[i][j];
f[i+][]+=*f[i][j];
}
f[i+][]+=*f[i][];
}
}
int main()
{
pre();
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
k=;
for(m=;f[m][]<n;m++);
for(int i=m;i;i--)//i
for(int j=;j<=;j++)
{
long long cnt=f[i-][];
if(j==||k==)
for(int l=max(-k-(j==),);l<;l++)
cnt+=f[i-][l];
// printf("i=%d j=%d cnt=%lld n=%d\n",i,j,cnt,n);
if(cnt<n)n-=cnt;
else
{
if(k<)
{
if(j==)k++;
else k=;
}
printf("%d",j);
// printf("i=%d j=%d\n",i,j);
break;
}
}
printf("\n");
}
return ;
}
POJ3208魔鬼数的更多相关文章
- POJ3208 Apocalypse Someday
题意 Language:Default Apocalypse Someday Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 2 ...
- poj3208启示录——数位DP
题目:http://poj.org/problem?id=3208 数位DP,首先按位数预处理出每一种位数的情况,包括有多少个魔鬼数和有多少个以6开头的非魔鬼数,以便递推.累加等等: 然后先找出第X个 ...
- poj3208 Apocalypse Someday[数位DP]
数位中出现至少3个连续的'6'的数字(称魔鬼数),询问满足要求的排名k的数. 经典题型.采用试填法. 递推做法:预处理出$i$位数字中满足要求的数(下记为'魔鬼数').对每一位都从0到9试一遍,然而卡 ...
- $Poj3208$ 启示录 数位统计$DP$
Poj AcWing Description Sol 这题长得就比较像数位$DP$叭. 所以先用$DP$进行预处理,再基于拼凑思想,通过"试填法"求出最终的答案. 设$F[i] ...
- POJ-3208 Apocalypse Someday (数位DP)
只要某数字的十进制表示中有三个6相邻,则该数字为魔鬼数,求第X小的魔鬼数\(X\le 5e7\) 这一类题目可以先用DP进行预处理,再基于拼凑思想,用"试填法"求出最终的答案 \( ...
- 0x5C 数位统计DP
怎么说,数位DP还是我的噩梦啊,细节太恐怖了. 但是这章感觉又和之前的学的数位DP有差异?(应该是用DP预处理降低时间复杂度,好劲啊,不过以前都是记忆化搜索的应该不会差多少) poj3208 f[i] ...
- c语言宏定义#define的理解与资料整理
1. 利用define来定义 数值宏常量 #define 宏定义是个演技非常高超的替身演员,但也会经常耍大牌的,所以我们用它要慎之又慎.它可以出现在代码的任何地方,从本行宏定义开始,以后的代码就就都认 ...
- C语言深度剖析---预处理(define)(转载)
1.数值宏常量 #define宏定义是个演技非常高超的替身演员,但也会耍大牌的,所以我们使用它要慎之又慎.它可以出现在代码的任何地方,从本行宏定义开始,以后的代码都认识宏了:也可以把任何东西都 ...
- 数位DP -启示录
http://poj.org/problem?id=3208 一个魔鬼数为包含连续三个666的的数字,给个n(n<5e7)求第n个魔鬼数. 预处理f[i][j],f[i][3]表示由前i位数字构 ...
随机推荐
- 小程序中的bindtap和catchtap的区别(交流QQ群:604788754)
bindtap绑定的节点,如果他的父节点也有绑定事件,点击之后就会出现冒泡. catchtap绑定的节点,如果他的父节点也有绑定事件,点击之后不会出现冒泡.
- 快速切题 usaco ariprog
题目:给定3<=n<=25,m<250,求m及以内的两两平方和能否构成为n的等差数列 1 WA 没有注意到应该按照公差-首项的顺序排序 2 MLE 尝试使用桶,但是实际上那可能是分散 ...
- UAC 注册表 WIN64 OS 运行时主题
首先EXE程序是32位,DelphiIDE对Project默认是启用主题的,默认情况在WIN64 OS下运行时,无管理员权限. WIN64 OS,默认情况下UAC是启用的. 上述默认情况下,EXE 是 ...
- 莪的拽、像省田各号①样没尽頭队——需求改进&原型设计
需求改进&原型设计 1. 需求&原型改进 经过老师的指导以及组内成员的讨论后,我们认为之前的需求分析已经比较准确完备. 根据电子宠物的形象结构特点,以及模拟屏幕的空间限制,我们设计出了 ...
- L1-022 奇偶分家
给定N个正整数,请统计奇数和偶数各有多少个? 输入格式: 输入第一行给出一个正整N(≤1000):第2行给出N个正整数,以空格分隔. 输出格式: 在一行中先后输出奇数的个数.偶数的个数.中间以1个空格 ...
- mysql|中主外键关系(转)
http://my.oschina.net/liting/blog/356150 一.外键: 1.什么是外键 2.外键语法 3.外键的条件 4.添加外键 5.删除外键 1.什么是外键: 主键:是唯一标 ...
- Individual work 总结
不得不说,这是我上大学以来所花时间最长.收获最多的个人项目之一.在此之前,虽然也上过面向对象等课程,课程对编程代码量的要求并不比这个小,但是由于从没有如这次这般,完全靠自己学习新的编程语言并进行编程实 ...
- Alpha阶段敏捷冲刺---Day6
一.Daily Scrum Meeting照片 二.今天冲刺情况反馈 今天的任务标志着我们项目进入收尾阶段,今天将完成大部分程序的功能,例如主界面设计,彻底完成计算模块,服务器随机生成题目等等,这些任 ...
- isKindOfClass in cocos2d-x
在最新版2.*的cocos2d-x中isKindOfClass可以用如下代码代替. 未验证,不过看了引擎代码是这样写的 原代码 [s1 isKindOfClass:[DestHole class] ...
- 简单的C#爬虫
using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net ...