正题


题目大意

给定一个后缀数组,和每个地方填不同的字母可以获得的不同权值,求最大权值之和。


解题思路

先用后缀数组aaa计算出每个后缀的排名RankRankRank数组。

然后考虑dpdpdp,首先我们发现对于aia_iai​,每个cai≤cai+1c_{a_i}\leq c_{a_{i+1}}cai​​≤cai+1​​(ccc表示字符串)。所以我们可以用fi,jf_{i,j}fi,j​表示aia_iai​的位置填jjj这个字符且前面的aia_iai​都填完的最大代价。

这时候我们需要考虑这个位置和上个位置是否可以相同。对于两个子串,头字符相同,我们就会比较后面的字符,而我们已经知道每个后缀的RankRankRank了,直接比较除头字符以外的就好了。


codecodecode

#include<cstdio>
#include<algorithm>
#define N 100010
using namespace std;
int n,seed,w[N][30],a[N],z[N],rank[N],f[N][30],ans;
int mak_ran()
{seed=(long long)(100000005ll*(long long)seed+1532777326ll)%998244353ll;return seed/100;
}
int main()
{scanf("%d%d",&n,&seed);for(int i=1;i<=n;i++)for(int j=0;j<26;j++)w[i][j]=mak_ran()%10000;for(int i=1;i<=n;i++)scanf("%d",&a[i]),rank[a[i]]=i;for(int i=0;i<26;i++){f[1][i]=w[a[1]][i];if(n==1) ans=max(ans,f[1][i]);}for(int i=2;i<=n;i++)for(int j=0;j<26;j++){for(int k=0;k<=j;k++){if(k==j&&rank[a[i]+1]<=rank[a[i-1]+1]) continue;f[i][j]=max(f[i][j],f[i-1][k]+w[a[i]][j]);}if(i==n) ans=max(ans,f[i][j]);}printf("%d",ans);
}

jzoj4227-B【dp,字符串】相关推荐

  1. 动态规划 —— 线性 DP —— 字符串编辑距离

    [概述] 字符串编辑距离,即 Levenshtein 距离,是俄国科学家 Vladimir Levenshtein 提出的概念,是指从一个字符串修改到另一个字符串时,编辑单个字符所需的最少次数,编辑单 ...

  2. POJ 2817 状态DP 字符串找最多的重复

    题意: 给出字符串个数 n 给出n串字符串 找出上下两个字符串重复和最多的个数.. eg: 5 abc bcd cde aaa bfcde 0根据 aaa abc bcd cde bfcde答案就是重 ...

  3. hdu 1159(DP+字符串最长公共序列)

    http://blog.csdn.net/a_eagle/article/details/7213236 公共序列可以用一个二维数组dp[i][j]保存每个点时的最大数字,本质就是一个双向比较. dp ...

  4. 蓝桥杯 算法训练 Cowboys By Assassin dp+字符串操作

    问题描述一个间不容发的时刻:n个牛仔站立于一个环中,并且每个牛仔都用左轮手枪指着他旁边的人!每个牛仔指着他顺时针或者逆时针方向上的相邻的人.正如很多西部片那样,在这一刻,绳命是入刺的不可惜--对峙的场 ...

  5. CodeForces - 1422E Minlexes(dp+字符串)

    题目链接:点击查看 题目大意:对一个长度为 n 的字符串 s 来说,可以进行的操作如下: 选出一个二元对 ( i , i + 1 ) 满足 i >= 0 && i + 1 < ...

  6. 【2018.3.31】模拟赛之四-ssl2408 句子【dp,字符串】

    正题 大意 先给出n个句子,然后给出一个最终句子.最终句子由多个句子加密后组成(可能重复).加密方法就是将字母调换位置,加密代价就是该位置与原来的字母不同的数量.求达到最终句子的最小加密代价 解题思路 ...

  7. 欢乐纪中某B组赛【2019.1.28】

    前言 心态爆炸 成绩 RankRankRank是有算别人的 RankRankRank PersonPersonPerson ScoreScoreScore AAA BBB CCC DDD 333 20 ...

  8. linux查看占用的命令,linux内存占用查看命令

    PLL输出怎么不能配置成我想要的时钟 如下图,我的clk_out7想配置成160M,十几输出变为了150M VI命令----用于检索 装了个虚拟机Ubuntu,命令行模式用VI很不适应,需要学习! 1 ...

  9. ssl初一组周六模拟赛【2018.3.31】

    前言 先说一下成绩: 姓名 成绩 hjq 300 wyc(本人千年老二) 270 zyc 260 xjq 240 lw 223 xxy 220 lrz 200 hzb 200 正题 题目1:ssl24 ...

最新文章

  1. 【C#串口编程计划】C#串口协议解析 -- 文本数据
  2. 3D人脸重建和人脸分析常用的数据集汇总
  3. OpenAI开源机器人模拟Python库mujoco-py:可高效处理并行模拟
  4. 《SQL入门经典》学习笔记
  5. Java 中各种锁的介绍
  6. 操作系统:再见CentOS,将于本月底终止维护!
  7. Packet Tracer 5.0实验(四) 利用三层交换机实现VLAN间路由
  8. layui tree ajax刷新,layer 刷新某个页面的实现方法
  9. YII2 rules 规则验证器
  10. 单元测试中简单使用Mockito解决Spring Bean依赖树问题
  11. back propagation反向传播(浅层神经网络分析示例)
  12. win10mysql服务器修改密码,Windows下mysql修改root密码的4种方法
  13. express 内存溢出问题分析定位
  14. 好多粉数据上报之360点睛平台ocpc API上报数据方法
  15. jpa 清空数据库的写法
  16. 利用 Python 分析 MovieLens 1M 数据集
  17. 微信小程序-导航吸顶+view锚点
  18. 被言情小说泡大的人工智能,随便写几行字都是情诗
  19. 一个本科渣渣是怎么逆袭从咸鱼到Offer收割机的?大厂面经合集
  20. 用IDEA进行Java后台开发(三)

热门文章

  1. 秋招面试我去了拼多多,直接被问JVMGC底层原理和算法,我吊打面试官
  2. 加时间水印_如何在手机照片上添加时间和日期?打开这个设置即可添加,超方便...
  3. s6730堆叠_不再只是堆叠硬件 ivvi S6全方位评测
  4. 数据库年月日时分秒_数据库基本使用系列(二)
  5. 算法设计与分析——递归与分治策略——全排列
  6. cheatengine找不到数值_彩票中奖500万,领了还不到一半?这些问题不解决,钱都拿不走...
  7. leetcode213. 打家劫舍 II
  8. [Redis6]Redis相关知识介绍
  9. 如何找到Eclipse左侧项目栏
  10. 算法-二分搜索-找出最大值和次大值