传送门

文章目录

  • 题意:
  • 思路:

题意:

给你nnn个串,字符集是a−za-za−z,让你在每个串种选择一个子序列,保证对于i<j,si<sji<j,s_i<s_ji<j,si​<sj​,也就是选择的串字典序是严格递增的,让你选择一种方式,使得选择的字符串长度之和最大。

n≤15,∣s∣≤15n\le15,|s|\le15n≤15,∣s∣≤15

思路:

其实看到范围这么小,应该比较容易想到是个状压dpdpdp。

所以我们就套路的设f[i][j]f[i][j]f[i][j]表示到了iii个串,第iii个串状态为jjj的方案数,转移的话就从上一个状态的所有方案取能到当前串的时候转移,复杂度O(n230)O(n2^{30})O(n230),显然过不去。。。

所以我们考虑优化转移,注意到直接找字典序不好找,我们能不能维护一个前缀最大值,让后二分呢?显然可以,我们改一下状态,改为f[i][j]f[i][j]f[i][j]表示到了第iii个串,当前选择的串是第jjj大的串,这样n215n2^{15}n215预处理一下,让后转移30n21530n2^{15}30n215转移即可,当然可以优化掉这个二分,由于其具有单调性,整个双指针即可。

由于一开始看错题,代码写的极其丑陋。

//#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<deque>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid ((tr[u].l+tr[u].r)>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=400100,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n;
int f[30][1<<16],g[30][1<<16];
vector<string>s[30];int main() {scanf("%d",&n);for(int i=1;i<=n;i++) {string ss; cin>>ss;int len=ss.length();for(int j=1;j<1<<len;j++) {string now;for(int k=0;k<len;k++) if(j>>k&1) now+=ss[k];s[i].push_back(now);}sort(s[i].begin(),s[i].end()); s[i].erase(unique(s[i].begin(),s[i].end()),s[i].end());}int ans=0;for(int i=1;i<=s[1].size();i++) f[1][i]=s[1][i-1].size(),g[1][i]=max(g[1][i-1],f[1][i]);for(int i=2;i<=n;i++) {int len=s[i].size();for(int j=1;j<=len;j++) {g[i][j]=g[i][j-1];int pos=lower_bound(s[i-1].begin(),s[i-1].end(),s[i][j-1])-s[i-1].begin();if(!pos||!g[i-1][pos]) continue;f[i][j]=g[i-1][pos]+s[i][j-1].size();g[i][j]=max(g[i][j],f[i][j]);
//          if(i==n&&pos) ans=max(ans,f[i][j]);}
//      for(int j=1;j<=s[i].size();j++) f[i][j]=s[i][j-1].size(),g[i][j]=max(g[i][j-1],f[i][j]);}ans=g[n][s[n].size()];if(ans==0) puts("-1");else cout<<ans<<endl;return 0;
}

2018 ICPC Asia Jakarta Regional Contest J. Future Generation 状压dp相关推荐

  1. 2018 ICPC Asia Jakarta Regional Contest

    2018 ICPC Asia Jakarta Regional Contest 题号 题目 知识点 难度 A Edit Distance B Rotating Gear C Smart Thief D ...

  2. 【树的哈希/树同构】2019-2020 ICPC, Asia Jakarta Regional Contest - F. Regular Forestation

    题目链接https://codeforces.com/contest/1252/problem/F 题意 给出一棵树,问删去一个度大于1的节点,使得剩下的树两两同构.问剩下的树最多是多少. 题解 容易 ...

  3. The 2020 ICPC Asia Macau Regional Contest J. Jewel Grab(数颜色+链表)

    J. Jewel Grab Tartarus _Wallace_ 转化询问:对于一个询问 [s,k],找到一个最长的区间 [s,t],满足区间中出现次数超过一次的元素,的出现次数减一,的和,不超过 k ...

  4. Gym - 101981G The 2018 ICPC Asia Nanjing Regional Contest G.Pyramid 找规律

    数一个n阶三角形中,有多少个全等三角形,n<=1e9 拿到题想找规律,手画开始一直数漏....,最后还是打了个表 (打表就是随便定个点为(0,0),然后(2,0),(4,0),(6,0),(1, ...

  5. The 2018 ACM-ICPC Asia Qingdao Regional Contest

    The 2018 ACM-ICPC Asia Qingdao Regional Contest 青岛总体来说只会3题 C #include<bits/stdc++.h> using nam ...

  6. The 2019 ICPC Asia Shanghai Regional Contest

    The 2019 ICPC Asia Shanghai Regional Contest 题号 题目 知识点 A Mr. Panda and Dominoes B Prefix Code C Maze ...

  7. 2018 ACM-ICPC Asia Beijing Regional Contest题解

    以下所有AC题解程序来自"仙客传奇"团队. A. Jin Yong's Wukong Ranking List AC的C++语言程序: #include <iostream& ...

  8. 【题目记录】——The 2021 ICPC Asia Jinan Regional Contest

    文章目录 C Optimal Strategy 组合数 H Game Coin K Search For Mafuyu 欧拉序列 题目集地址 The 2021 ICPC Asia Jinan Regi ...

  9. 2019-2020 ICPC Asia Xuzhou Regional Contest【徐州现场赛】

    题目: 209-2020 ICPC Asia Xuzhou Regional Onsite Contest E. Multiply 题意: 找到最大的 i 使得 z*x^i 是 y! 的因子 分析: ...

最新文章

  1. oracle创建DBA角色命令,oracle常用DBA命令
  2. Mongodb的索引操作
  3. 新型智能头盔可快速评估患者中风的大小、位置和类型
  4. Linux 关于动态链接库以及静态链接库的一些概念
  5. linux嵌入式开发遇到坑不用慌 让你快速提升进度
  6. 查oracle事务超时时间,ORA-24756: 事务处理不存在 分析
  7. linux提升权限命令提示符,win10如何直接使用命令提示符提高管理员权限?
  8. Advanced User Administration
  9. Win10使用Xrdp脚本远程桌面连接Ubuntu主机
  10. 数组的最长递减子序列java_求一个数组的最长递减子序列 比如{9,4,3,2,5,4,3,2}的最长递减子序列为{9,5,4,3,2}...
  11. 没事不要在for循环期间增减迭代序列的成员
  12. 【ACL2020】今日放榜,779篇论文被接收,姚班校友陈丹琦首日演讲
  13. 如何利用javascript获取表单中select下拉列表中所选中项的值value
  14. php1054,php – 找不到列:1054’字段列表’Laravel中的未知列’_token’
  15. (5)Redis主从同步原理及详细配置
  16. 7.nestjs文件上传
  17. 【对数几率回归】matlab实现
  18. 规范完整APP开发制作流程
  19. Vue ElementUI table给表格一个斜线分隔线
  20. jQuery —— 元素绑定单击事件(click),但是双击该元素也能触发单击事件,同时会触发两次单击事件的问题

热门文章

  1. 安装bigdesk后es无法启动_安装天正后,探索者无法双击启动?
  2. 刷题≠学好数学,近百位名校名师告诉你,数学是怎么学好的?
  3. 看完这15张动图,秒懂万有引力与航天难点!
  4. 动力强劲的星型发动机,为何不用在汽车上呢?
  5. 入门Python,限时1元!
  6. 加密货币的时代,真的来临了吗?
  7. 学习 Python 编程的 19 个资源
  8. mysql插入时间区间_mybatis插入数据时返回主键以及MySQL根据时间区间查询问题总结...
  9. 抽屉远离在计算机的应用,抽屉原理的应用及其推广优秀毕业论文
  10. 简述本地组策略中用户和计算机配置的差异,组策略编辑器中的计算机配置和用户配置有什么区别吗?...