[CodeForces-178F]Representative Sampling
题目大意:
给你n个字符串,要求从中选出k个字符串,使得字符串两两lcp之和最大。
思路:
动态规划。
首先将所有的字符串排序,求出相邻两个字符串的lcp长度(很显然,对于某一个字符串,和它lcp最长的字符串一定是和它字典序最接近的一个)。
接下来考虑一种类似于分治的做法。
首先找出当前区间内最小的lcp。
很显然,在这个lcp左边的字符串和右边的字符串配对时的lcp一定是这个lcp。
假如我们在左边取了i个,右边取了j个,这个lcp对答案的贡献是lcp*i*j。
接下来递归处理左半边的区间和右半边的区间即可。
考虑如何表示状态。
不难想到用f[l][r][k]表示在l~r之间取k个字符串。
每次递归枚举左右区间取的个数。
总共有n^2k种状态,如果使用记忆化,很显然数组开不下。
不使用记忆化则会TLE。
接下来考虑改进这个状态。
我们递归的时候不需要针对某一个具体的k,而是在l,r这个状态内枚举k。
显然,对于同一个l,r,k,只会被转移一次。
而同一组l,r只会被转移一次。
因此我们只需要在递归的时候存一下l,r,然后就把它废弃掉。
这就相当于动态开数组。
这样就同时解决了时间和空间上的问题。
#include<string>
#include<iostream>
#include<algorithm>
const int inf=0x7fffffff;
const int N=,K=;
std::string s[N];
int n,k,lcp[N];
int f[N<<][K],cnt;
void dp(const int &l,const int &r,const int &id) {
if(l==r) return;
int mid=;
for(register int i=l+;i<=r;i++) {
if(lcp[i]<lcp[mid]) mid=i;
}
const int lid=cnt++,rid=cnt++;
dp(l,mid-,lid);
dp(mid,r,rid);
__builtin_memset(f[id],,sizeof f[id]);
for(register int i=;i<=k;i++) {
if(i>mid-l) break;
for(register int j=;j<=k;j++) {
if(j>r-mid+) break;
if(i+j<=k) f[id][i+j]=std::max(f[id][i+j],f[lid][i]+f[rid][j]+lcp[mid]*i*j);
}
}
cnt-=;
}
int main() {
std::ios_base::sync_with_stdio(false);
std::cin.tie(NULL);
std::cin>>n>>k;
for(register int i=;i<n;i++) {
std::cin>>s[i];
}
std::sort(&s[],&s[n]);
lcp[]=inf;
for(register int i=;i<n;i++) {
lcp[i]=std::min(s[i].length(),s[i-].length());
for(register int j=;j<lcp[i];j++) {
if(s[i][j]!=s[i-][j]) {
lcp[i]=j;
}
}
}
dp(,n-,cnt++);
std::cout<<f[][k]<<std::endl;
return ;
}
[CodeForces-178F]Representative Sampling的更多相关文章
- [Codeforces178F2]Representative Sampling
Problem 给定n个字符串Si,任意选出k个字符串Ai,使得其中任意两个字符串lcp之和最大. Solution 建一棵trie树,枚举每一个节点对答案的贡献,树形dp,时间复杂度像是O(N^3) ...
- Simple Random Sampling|representative sample|probability sampling|simple random sampling with replacement| simple random sampling without replacement|Random-Number Tables
1.2 Simple Random Sampling Census, :全部信息 Sampling: 抽样方式: representative sample:有偏向,研究者选择自己觉得有代表性的sam ...
- Survey sampling
Survey sampling \(\bullet\)What is survey sampling?(c.f.census survey)(c.f.:参考,查看,来源于拉丁语) \(\bullet\ ...
- 图像抠图算法学习 - Shared Sampling for Real-Time Alpha Matting
一.序言 陆陆续续的如果累计起来,我估计至少有二十来位左右的朋友加我QQ,向我咨询有关抠图方面的算法,可惜的是,我对这方面之前一直是没有研究过的.除了利用和Photoshop中的魔棒一样的技术或者 ...
- 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的概 ...
随机推荐
- HDU 2159 FATE (dp)
题目链接 Problem Description 最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务.久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最 ...
- html 中的列表
html 中列表可以分为 1. 无序列表(ul--li 的形式) 2. 有序列表(ol li的形式) 3. 定义列表(dl 的形式) 下面来看几种列表的具体内容: 1.无序列表. 无序列表的格式 ...
- java实现ftp文件上传下载,解决慢,中文乱码,多个文件下载等问题
//文件上传 public static boolean uploadToFTP(String url,int port,String username,String password,String ...
- Getting Started with Django Rest Framework and AngularJS
转载自:http://blog.kevinastone.com/getting-started-with-django-rest-framework-and-angularjs.html A ReST ...
- Mysql自带profiling性能分析工具使用分享
1. show variables like '%profiling%';(查看profiling信息) 2. set profiling=1;(开启profiling) 3. 执行S ...
- 美化的select下拉框
ie7浏览器以后的下拉框,给他加上边框样式,是没用的.要是想做出样式好看的下拉框需要用js或者jquery来模拟实现. 代码如下: <div class="r"> &l ...
- untiy3d学习笔记
Unity3d 记录 1.63讲 主要讲了menicam 从3D软件里面导出过后,注意如果是人物模型命名一定要非常清晰并且对称.选择到模型后等到到humanoid后可以使用menicam.然后使用me ...
- C#子线程中更新ui-----c# 多线程多文件批量下载
c# 多线程多文件批量下载 废话少说,先演示一张效果图 简单说下过程喽 开发过程中其实总是会碰到项目想应用下载文件~ 看其他语言有很多封装好的类库可以使用~~ 作为小白的我并没有找到很多c#的案例 ...
- IE8/9的几个前端bug解决方案
最近做的东西需要兼容IE……啊真是令人忧伤…… 解决低版本IE的buggy inline-block 低版本的IE只对本身inline的元素能用inline-block,而本身为block的元素需要设 ...
- IEEEXtreme 10.0 - Game of Stones
这是 meelo 原创的 IEEEXtreme极限编程大赛题解 Xtreme 10.0 - Game of Stones 题目来源 第10届IEEE极限编程大赛 https://www.hackerr ...