NKOJ 2522【SDOI2008】Sandy的卡片

问题描述

Sandy和Sue的热衷于收集干脆面中的卡片。
然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片兑换超炫的人物模型。
每一张卡片都由一些数字进行标记,第i张卡片的序列长度为Mi,要想兑换人物模型,首先必须要集够N张卡片,对于这N张卡片,如果他们都有一个相同的子串长度为k,则可以兑换一个等级为k的人物模型。相同的定义为:两个子串长度相同且一个串的全部元素加上一个数就会变成另一个串。
Sandy的卡片数远远小于要求的N,于是Sue决定在Sandy的生日将自己的卡片送给Sandy,在Sue的帮助下,Sandy终于集够了N张卡片,但是,Sandy并不清楚他可以兑换到哪个等级的人物模型,现在,请你帮助Sandy和Sue,看看他们最高能够得到哪个等级的人物模型。

输入格式

第一行为一个数N,表示可以兑换人物模型最少需要的卡片数,即Sandy现在有的卡片数
第i+1行到第i+N行每行第一个数为第i张卡片序列的长度Mi,之后j+1到j+1+Mi个数,用空格分隔,分别表示序列中的第j个数

输出格式

一个数k,表示可以获得的最高等级。

样例输入

2
2 1 2
3 4 5 9

样例输出

2

数据范围

30%的数据保证n<=50
100%的数据保证n<=1000,m<=200


题目描述有点不明,说成“每个元素都加上某个数”应该更清楚。

那么这样就有显然的差分了。我们需要求出的就是n个差分数组的最长公共子串了。

不妨先回顾两个数组的最长公共子串的求法:

设f[i][j]f[i][j]表示AA的前i个字符与BB的前j个字符的最长公共子串长度,且满足Ai=BjA_i=B_j,即末尾元素相同。
Ai=Bj时,f[i][j]=f[i−1][j−1]+1;A_i=B_j时,f[i][j]=f[i-1][j-1]+1;
否则,f[i][j]=0。f[i][j]=0。

现在假设我们求出了第一个数组和其他每个数组的f[i][j]f[i][j],将第一个数组的前j位与第i个数组的前k位的最长公共子串的长度,且满足末尾元素相等的状态记为f[i][j][k]f[i][j][k]。现在如何求出所有数组的最长公共子串的长度。这时需要一个新的数组Ans[i]=min(max(f[j][i][k],1≤k≤lenj),2≤j≤N)Ans[i]=min(max(f[j][i][k],1\leq k\leq len_j),2\leq j\leq N),那么max(Ans[i],1≤i≤len1)max(Ans[i],1\leq i \leq len_1)即是最终答案。

不知道怎么解释比较好。固定第一个数组作为标准是关键。详见代码。


#include<stdio.h>
#include<cstring>
#define Min(x,y) ((x<y)?(x):(y))
#define Max(x,y) ((x>y)?(x):(y))int N,M,D[1005][205],Tmp[205],Ans,f[205][205],TT[205];int main()
{
    int i,j,k,a,b;    scanf("%d",&N);
    for(i=1;i<=N;i++)
    {        scanf("%d",&M);D[i][0]=M;
        for(j=1;j<=M;j++)scanf("%d",&Tmp[j]);
        for(j=1;j<M;j++)D[i][j]=Tmp[j+1]-Tmp[j];
    }    for(i=1;i<D[1][0];i++)TT[i]=i;
    for(k=2;k<=N;k++)
    {        memset(f,0,sizeof(f));
        memset(Tmp,0,sizeof(Tmp));        for(i=1;i<D[1][0];i++)
        for(j=1;j<D[k][0];j++)
        {            if(D[1][i]==D[k][j])
            {                f[i][j]=f[i-1][j-1]+1;
                Tmp[i]=Max(Tmp[i],f[i][j]);
            }
        }        for(i=1;i<D[1][0];i++)TT[i]=Min(TT[i],Tmp[i]);
    }    for(i=1;i<D[1][0];i++)Ans=Max(Ans,TT[i]);    printf("%d",Ans+1);
}

【SDOI2008】Sandy的卡片 DP相关推荐

  1. 洛谷 P2463 [SDOI2008]Sandy的卡片 解题报告

    P2463 [SDOI2008]Sandy的卡片 题意 给\(n(\le 1000)\)串,定义两个串相等为"长度相同,且一个串每个数加某个数与另一个串完全相同",求所有串的最长公 ...

  2. 【bzoj4698】[Sdoi2008] Sandy的卡片 后缀数组

    题目描述 Sandy和Sue的热衷于收集干脆面中的卡片.然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片兑换超炫的人物模型.每一张卡片都由一些数字进行标记,第i张卡片的序列 ...

  3. [SDOI2008]Sandy的卡片

    题目描述 Sandy和Sue的热衷于收集干脆面中的卡片. 然而,Sue收集卡片是因为卡片上漂亮的人物形象,而Sandy则是为了积攒卡片兑换超炫的人物模型. 每一张卡片都由一些数字进行标记,第i张卡片的 ...

  4. [BZOJ4698][SDOI2008]Sandy的卡片(后缀自动机)

    差分之后就是求多串LCS. 对其中一个串建SAM,然后把其它串放在上面跑. 对SAM上的每个状态都用f[x]记录这个状态与当前串的最长匹配长度,res[x]是对每次的f[x]取最小值.答案就是res[ ...

  5. 4698: Sdoi2008 Sandy的卡片

    前言 总之这个东西说起来很麻烦就是了, 思路 差分合并+后缀数组+二分(dddl) 类似于那个bzoj1031的复制子串和那个poj1743的差分 来看个例子 3 5 1 2 3 4 5 4 1 1 ...

  6. BZOJ4698: Sdoi2008 Sandy的卡片

    题解: 裸后缀数组+二分答案 /**************************************************************Problem: 4698User: c20 ...

  7. Luogu P2463 [SDOI2008]Sandy的卡片

    题目链接 \(Click\) \(Here\) 真的好麻烦啊..事实证明,理解是理解,一定要认认真真把板子打牢,不然调锅的时候真的会很痛苦..(最好是八分钟能无脑把\(SA\)码对的程度\(QAQ\) ...

  8. [luoguP2463] [SDOI2008]Sandy的卡片(后缀数组 + st表)

    传送门 很容易想到,题目中的相同是指差分数组相同. 那么可以把差分数组连起来,中间加上一个没有出现过的且字典序小的数 双指针移动,用st表维护height数组中的最小值. 当然用单调队列应该也可以且更 ...

  9. 洛谷P2463 [SDOI2008]Sandy的卡片(后缀数组SA + 差分 + 二分答案)

    题目链接:https://www.luogu.org/problem/P2463 [题意] 求出N个串中都出现的相同子串的最长长度,相同子串的定义如题:所有元素加上一个数变成另一个,则这两个串相同,可 ...

  10. 洛咕 P2463 [SDOI2008]Sandy的卡片

    哈希水过. 首先这是一段delta相同的序列,按照套路差分一下,b[i]=a[i]-a[i-1],然后就是这些序列的最长公共子段 由于数据范围很小,就可以二分,枚举第一个序列的子段然后每个子序列暴力c ...

最新文章

  1. sed学习系列---第3/3部分
  2. 《ANSYS 14.0超级学习手册》一第2章 高级应用的基石——APDL
  3. 理解神经网络,从简单的例子开始(2)使用python建立多层神经网络
  4. 什么是Unwind segues,您如何使用它们?
  5. Python——[Anaconda+Jupyter Notebook+Python3.6]环境下安装face_recognition
  6. OC第六节 遍历集合、数组排序
  7. beeline连接hiveserver2报错:User: root is not allowed to impersonate root
  8. oracle tirger_TPS65130RGETG4_驱动_中文手册(3/10)_TI - 万联芯城
  9. 拷贝构造函数什么时候调用?
  10. C#调用三菱的MX Component控件与三菱PLC进行通讯
  11. 古剑奇谭如何修改服务器,寻木枝改方向了!《古剑奇谭网络版》这波更新太值得去体验了...
  12. 关于Iphone的手势识别
  13. Ultrasound Open Platforms for Next-Generation Imaging Technique Development
  14. VSCode中Markdown 无法显示图片
  15. SEO批量文章繁简转换,同义词替换
  16. 威哥android视频百度云,威哥带你手把手开发Android电商项目视频教程
  17. android ops,安卓OPS电脑解决方案,促进城市智能化
  18. 5G NR CSI-RS介绍(2)-- TRS
  19. 二手车交易数据接口调用代码返回示例
  20. DSP音频软件与算法开发

热门文章

  1. tailwindcss:弟弟们都往后稍稍
  2. bugku-秋名山老司机
  3. 李沐老师 PyTorch版——线性回归 + softmax回归的简洁实现(3)
  4. Android Fragment already added 解决方式
  5. 制作简单的指纹图集,并对其进行处理
  6. 【科研工具】在科研人的浏览器里,多个插件多条路。
  7. Python pandas.pivot_table学习笔记1
  8. 经典音频MUTE电路分析
  9. TypeError: Class constructor ServeCommand cannot be invoked without ‘new‘
  10. 鼠标清除计算机密码,装机大师PE怎么清除修改电脑密码