Brief Intro:

将所有n位二进制串中满足字典序不大于其逆序串,取反串,逆序取反串中按字典序排序的第m个输出

n<=50

Algorithm:

首次接触数位DP的题目

根据数据范围,我们不能枚举。从而只能一位一位确定

由于要求字典序第m大的,我们可以通过求出如果当前位为0的个数来确定该位为0还是1

接下来就是典型的数位DP了

数位DP其实也就是一个记忆化的过程,同时在状态中用变量对上界加以标识

此题中即为dp[cur][rev][inv],后两位表示是否达到反串上界和逆串上界

Code:

#include <bits/stdc++.h>

using namespace std;
typedef long long ll; ll n,k,dp[][][],res[]; ll solve(ll cur,ll rev,ll inv)
{
if(dp[cur][rev][inv]>-) return dp[cur][rev][inv]; //记忆化
if(cur*>=n) return dp[cur][rev][inv]=; ll &ret=dp[cur][rev][inv]=;
for(int i=;i<;i++)
if(res[cur+]==i || res[cur+]==-)
for(int j=;j<;j++)
if(res[n-cur]==j || res[n-cur]==-)
if((i==j || *cur+!=n) && (!rev || i<=j) && (!inv || i<=-j))
ret+=solve(cur+,rev&(i==j),inv&(i!=j));
return ret;
} int main()
{
cin >> n >> k;k++; memset(dp,-,sizeof(dp));
memset(res,-,sizeof(res)); if(solve(,,)<k)
return cout << -,; for(int i=;i<=n;i++)
{
memset(dp,-,sizeof(dp));
res[i]=;
ll t=solve(,,); //判断该位的值
if(t<k) k-=t,res[i]=;
cout << res[i];
}
return ;
}

Review:

1、对于求第k个满足要求的数时

可以通过  已知前缀枚举满足要求的个数+逐位确定每一位 的方法来取代枚举

2、数位DP的特殊点仅仅在对上界状态的维护,其余和记忆化搜索相同

[Codeforces 8E] Beads的更多相关文章

  1. Codeforces Round #339 (Div. 1) C. Necklace 构造题

    C. Necklace 题目连接: http://www.codeforces.com/contest/613/problem/C Description Ivan wants to make a n ...

  2. python爬虫学习(5) —— 扒一下codeforces题面

    上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...

  3. 【Codeforces 738D】Sea Battle(贪心)

    http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...

  4. 【Codeforces 738C】Road to Cinema

    http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...

  5. 【Codeforces 738A】Interview with Oleg

    http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...

  6. CodeForces - 662A Gambling Nim

    http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...

  7. CodeForces - 274B Zero Tree

    http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...

  8. CodeForces - 261B Maxim and Restaurant

    http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...

  9. CodeForces - 696B Puzzles

    http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...

随机推荐

  1. MySQL使用笔记(一)安装配置

    By francis_hao    Nov 27,2016   一般软件的安装都是可以通过源码和安装包安装,源码安装可配置性好些,安装包安装比较省事,况且使用yum也可以解决依赖的问题,基本实现了一键 ...

  2. java禁止实例化的工具类

    public class Q { /** * @param args */ public static void main(String[] args) { new Person() } } clas ...

  3. charles 踩坑记录

    charles破解教程:http://www.jianshu.com/p/12e75eb8f53d 1.需注意软件和破解脚本的版本是否正确(例如3.x.x版本的破解脚本不能用于4.x.x版本的char ...

  4. [NOIp普及组2011]瑞士轮

    洛谷题目链接:瑞士轮 题目背景 在双人对决的竞技性比赛,如乒乓球.羽毛球.国际象棋中,最常见的赛制是淘汰赛和循环赛.前者的特点是比赛场数少,每场都紧张刺激,但偶然性较高.后者的特点是较为公平,偶然性较 ...

  5. 【BZOJ2338】【HNOI2011】数矩形 [计算几何]

    数矩形 Time Limit: 20 Sec  Memory Limit: 128 MB[Submit][Status][Discuss] Description 最近某歌手在研究自己的全国巡回演出, ...

  6. bzoj3127/3697 [Usaco2013 Open]Yin and Yang

    传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=3127 http://www.lydsy.com/JudgeOnline/problem.ph ...

  7. 通过 CLI 搭建 ghost

    参考: ghost 官网 系统架构说明 架构 架构说明 本实践将 web 接入, nodejs 服务, 数据库分离, 适合生产环境场景. nginx 接入请求, 反向代理后端 nodejs 服务 no ...

  8. go开发

    我开发中一直用这一段 //for debuggingfunc printPretty(v interface{}, mark string) (err error) { fmt.Printf(&quo ...

  9. POJ1220(大数进制转换)

    NUMBER BASE CONVERSION Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4652   Accepted: ...

  10. python实战===石头剪刀布,简单模型

    #石头剪刀布 import random import time win_list = [("石头","剪刀"),("布","石头 ...