[Codeforces 8E] Beads
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的更多相关文章
- Codeforces Round #339 (Div. 1) C. Necklace 构造题
C. Necklace 题目连接: http://www.codeforces.com/contest/613/problem/C Description Ivan wants to make a n ...
- python爬虫学习(5) —— 扒一下codeforces题面
上一次我们拿学校的URP做了个小小的demo.... 其实我们还可以把每个学生的证件照爬下来做成一个证件照校花校草评比 另外也可以写一个物理实验自动选课... 但是出于多种原因,,还是绕开这些敏感话题 ...
- 【Codeforces 738D】Sea Battle(贪心)
http://codeforces.com/contest/738/problem/D Galya is playing one-dimensional Sea Battle on a 1 × n g ...
- 【Codeforces 738C】Road to Cinema
http://codeforces.com/contest/738/problem/C Vasya is currently at a car rental service, and he wants ...
- 【Codeforces 738A】Interview with Oleg
http://codeforces.com/contest/738/problem/A Polycarp has interviewed Oleg and has written the interv ...
- CodeForces - 662A Gambling Nim
http://codeforces.com/problemset/problem/662/A 题目大意: 给定n(n <= 500000)张卡片,每张卡片的两个面都写有数字,每个面都有0.5的概 ...
- CodeForces - 274B Zero Tree
http://codeforces.com/problemset/problem/274/B 题目大意: 给定你一颗树,每个点上有权值. 现在你每次取出这颗树的一颗子树(即点集和边集均是原图的子集的连 ...
- CodeForces - 261B Maxim and Restaurant
http://codeforces.com/problemset/problem/261/B 题目大意:给定n个数a1-an(n<=50,ai<=50),随机打乱后,记Si=a1+a2+a ...
- CodeForces - 696B Puzzles
http://codeforces.com/problemset/problem/696/B 题目大意: 这是一颗有n个点的树,你从根开始游走,每当你第一次到达一个点时,把这个点的权记为(你已经到过不 ...
随机推荐
- nm用法小记
nm用于显示目标文件的符号,也是二进制工具集(info binutils)里的一员 先来看一个例子,源码和对应的命令结果 四部分分别表示的意义 符号所在的obj文件名 符号的值,这里应该是指符号所在段 ...
- jw player学习笔记----跨域请求
需求来源:播放器皮肤文件请求不到,被限制了. 参考官网解决方案: http://www.longtailvideo.com/support/jw-player/28844/crossdomain-fi ...
- css sprite应用
(一)实现简单的淘宝带图标侧边栏效果 <!DOCTYPE html> <html lang="en"> <head> <meta char ...
- Sencha touch中Ext.List的使用及高度自适应
最近在做 Sencha 的一个项目,需要用到 Ext.List 来列出所需商品及相关信息,平时我们使用 Ext.List 都是使用 fullscreen:true 来设置 List 全屏显示, 但 ...
- js如何弹出新窗口
js如何弹出新窗口 时间:2012-4-22 弹出新窗口也是在网页设计中会经常用到的,其用法也很简单,是通过调用javascript的内置函数windows.open来产生的. window.ope ...
- 【HDU】6146 Pokémon GO
[题意]一个2*n的网格,再保证步数最少的情况下,求从任意格出发遍历完所有格的方案数,格子八连通.n<=10000,T<=100. [算法]递推,DP [题解]原题链接:蓝桥杯 格子刷油漆 ...
- 玩转Metasploit系列(第二集)
在上一节的内容中,大家了解了Metasploit的结构.这一节我们主要介绍的是msfconsole的理论. msfconsole理论 在MSF里面msfconsole可以说是最流行的一个接口程序.很多 ...
- 关于chkrootkit 检查 INFECTED: Possible Malicious Linux.Xor.DDoS installed
chkrootkit检测时,发现一个Xor.DDoS内容,内容如下...Searching for Linux.Xor.DDoS ... INFECTED: Possible Malicious Li ...
- Python用户登陆
#!/usr/bin/env python # _*_ coding:UTF-8 _*_ # __auth__:Dahlhin import sys userinfo = r'userinfo.txt ...
- (转)Git冲突:commit your changes or stash them before you can merge. 解决办法
用git pull来更新代码的时候,遇到了下面的问题: error: Your local changes to the following files would be overwritten by ...