Codeforces Beta Round #8 E. Beads (数位dp)
来源:互联网 发布:爱奇艺视频下载软件 编辑:程序博客网 时间:2024/06/05 07:16
题目链接:
点击打开题目
题意:
将所有二进制串(只允许前导 0 )中,同时满足字典序不小于其逆序串,取反串和逆序取反串(三种都要满足)的串提出来,按字典序排序,求第m 个。 2<=n<=50,1<=m<=1016。
题解:
显然满足题意的二进制串的首位必须是0 。考虑一位一位地确定答案串。假设已经确定了答案串的前k 位,我们假设第k+1 位是0 ,则要设法统计出满足条件的串的个数s 。那么如果s<m ,则答案串第k+1 位为1 ,同时m=m−s ;否则答案串第k+1 位为0 。于是问题转化为,统计所有长度为n 的,前缀为prefix 的二进制串中,满足题目要求的串的个数。这是一类与数位有关的统计问题,于是很容易想到数位dp。那么考虑dp[i][j][rev][inv] 表示,当前已经确定了前i 位和末j 位,rev 表示前i 位与末j 位的逆序是否相等,inv 表示前i 位与末j 位的逆序取反后是否相等。状态转移比较显然,我们枚举第i+1 位和第n−i 位的取值,如果它满足prefix 的限制,且新的串没有违反题目要求(可以利用rev 和inv 和取值判断), 那么更新rev 和inv 的状态,并累加到对应的新状态上。
注意:
如果n 为奇数,那么dp到正中间一位的时候,这一位会同时作为前i 位和末j 位的组成部分,需要特判。
AC代码:
#include<bits/stdc++.h>using namespace std;typedef long long ll;int n, a[52]; ll k; bool vis[55][55][2][2]; ll dp[55][55][2][2]; ll ans;ll dfs(int l,int r,int rev,int inv){ if(l>r)return 1; if(vis[l][r][rev][inv]==true)return dp[l][r][rev][inv]; vis[l][r][rev][inv] =true; ll &ans=dp[l][r][rev][inv]; ans = 0; for(int i=0;i<2;i++) { if(a[l] == -1 || a[l] == i) { for(int j = 0; j < 2; j++) { if(a[r] == -1 || a[r] == j) { if(l < r || i == j) //特判n为奇数的时候,走到最中间的一位 { if(rev || i <= j) { if(inv || i <= 1 - j) { ans = ans + dfs(l + 1, r - 1, rev || i < j , inv || i < 1 - j); } } } } } } } return ans; }int main(){ memset(a,-1,sizeof(a)); cin>>n>>k; k++; a[0]=0; if(dfs(0,n-1,0,0)<k){ return 0*puts("-1"); } for(int i=1;i<n;i++) { a[i]=0; memset(vis,0,sizeof(vis)); ll cur=dfs(0,n-1,0,0); if(cur<k) { k -= cur; a[i]=1; } } for(int i=0;i<n;i++) { cout<<a[i]; } return 0;}
1 0
- Codeforces Beta Round #8 E. Beads (数位dp)
- Codeforces Beta Round #8 E. Beads(数位DP)
- Codeforces Beta Round #8 E. Beads
- Codeforces Beta Round #8 E. Beads
- Codeforces Beta Round #51 D. Beautiful numbers (数位dp)
- Codeforces Beta Round #51 D 数位DP
- Codeforces Beta Round #51 D 数位DP
- Codeforces Round #265 (Div. 2)E(数位dp)
- Codeforces Beta Round #51---D. Beautiful numbers(数位dp, 巧妙)
- Codeforces Beta Round #51 D. Beautiful numbers(数位dp)
- [状压DP] Codeforces Beta Round #72 Div1 E Two Subsequences
- Codeforces Beta Round #23 E. Tree(DP+高精度)
- Codeforces Beta Round #5 E
- Educational Codeforces Round 8 D. Magic Numbers(数位dp)
- Educational Codeforces Round 8 D. Magic Numbers (数位DP)
- codeforces 55D Beautiful numbers Codeforces Beta Round #51(数位dp)
- codeforces 215E 数位DP
- CodeForces 215E 数位DP
- 逻辑卷管理器LVM扩展,缩减,快照,删除
- 剑指offer-面试题 18:树的子结构
- Hibernate的优化方案
- Git部署(二)注册Git账号
- mysql必知必会读书笔记(三到九章)
- Codeforces Beta Round #8 E. Beads (数位dp)
- 自此使用Object字面量取代switch
- 已知图片某区域内所有点坐标,求区域周长(非opencv轮廓提取)
- [AHK]用AHK执行JavaScript
- git基本操作
- Uva10976—分数拆分
- 你的心态决定你的状态
- PHP的Reflection反射机制
- 【C语言】头文件的作用