返回首页 返回题库

划分字符串

C++ 中等 GESP六级真题 #动态规划

题目描述

题面描述

小A有一个由个小写字母组成的字符串。他希望将划分为若干个子串,使得子串中每个字母至多出现一次。

例如,对于字符串street来说,str + e + e + t是满足条件的划分;而s + tree + t不是,因为子串tree中e出现了两次。

额外地,小A还给出了价值,表示划分后长度为的子串价值为。小A希望最大化划分后得到的子串价值之和。你能帮他求出划分后子串价值之和的最大值吗?

输入格式

第一行,一个正整数,表示字符串的长度。

第二行,一个包含个小写字母的字符串。

第三行,个正整数,表示不同长度的子串价值。

输出格式

一行,一个整数,表示划分后子串价值之和的最大值。

样例1

输入:

6
street
2 1 7 4 3 3

输出:

13

样例2

输入:

8
blossoms
1 1 2 3 5 8 13 21

输出:

8

数据范围

对于40%的测试点,保证。

对于所有测试点,保证,。

时间限制

1.0 s

内存限制

512.0 MB

💡 查看提示(先自己想一想再看)
本题考察动态规划的应用,定义$f[i]$表示前$i$个字符划分的最大价值。对于每个$i$,向前枚举子串的起点$j$,用位掩码记录当前子串的字符出现情况,遇到重复字符时停止枚举,状态转移方程为$f[i] = max(f[i], f[j-1] + a[i-j+1])$。由于小写字母只有26个,每个位置最多向前枚举26次,时间复杂度为$O(n \times 26)$,可满足$10^5$的数据规模要求。注意使用long long类型避免整数溢出。
⚙ 开始做这道题 0 人做过 · 0 收藏 · 2 浏览

讨论(0)