题目链接: https://scut.online/p/125

题目描述

bxbx有一个长度一个字符串SS,bxbx可以对其进行若干次操作。

每次操作可以删掉一个长度为k(1 \leq k \leq n)k(1≤k≤n)的连续回文子串,bxbx获得a_ka​k​​的愉悦值。

一个字符串是回文串当且仅当正读和反读都是一样的。例如"a", "aa", "abcba""a","aa","abcba"是回文串,"ab", "abc","aabab""ab","abc","aabab"不是回文串。

字符串删除之后相邻的字符不会合并在一起。

现在,bxbx想知道他最多能获得多少愉悦值。

输入格式

输入第一行一个整数TT,表示数据组数。

对于每组数据,第一行一个整数nn。

第二行nn个整数,第ii个表示a_ia​i​​。

第三行为字符串SS。

1 \leq T \leq 201≤T≤20

1 \leq n \leq |S| \leq 50001≤n≤∣S∣≤5000

0 \leq a_i \leq 10000000000≤a​i​​≤1000000000

SS只包括小写字母。

输出格式

对每组数据,输出bxbx所能获得的最大愉悦值。

样例数据

输入

  1. 2
  2. 3
  3. 1 2 3
  4. aba
  5. 3
  6. 3 2 1
  7. aba

输出

  1. 3
  2. 9

题解:

1.ok[l][r]代表区间l~r的子串是否为回文串,O(n^2)预处理。

2. dp[i]代表删除前i个字符的最大价值, 状态转移方程为:if(ok[j][i])  dp[i] = max(dp[i],dp[j-1]+a[i-j+1]);

代码如下:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define ms(a, b) memset((a), (b), sizeof(a))
  4. typedef long long LL;
  5. const int INF = 2e9;
  6. const LL LNF = 9e18;
  7. const int mod = 1e9+;
  8. const int maxn = +;
  9.  
  10. char s[maxn];
  11. LL a[maxn], dp[maxn];
  12. bool ok[maxn][maxn];
  13.  
  14. int n, len;
  15.  
  16. void init()
  17. {
  18. ms(ok,);
  19. ms(dp,);
  20.  
  21. for(int i = ; i<=len; i++)
  22. {
  23. int l = i, r = i;
  24. while(l>= && r<=len && (r-l+)<=n && s[l]==s[r])
  25. ok[l--][r++] = ;
  26. }
  27.  
  28. for(int i = ; i<=len; i++)
  29. {
  30. int l = i, r = i+;
  31. while(l>= && r<=len && (r-l+)<=n && s[l]==s[r])
  32. ok[l--][r++] = ;
  33. }
  34. }
  35.  
  36. void solve()
  37. {
  38. for(int i = ; i<=len; i++)
  39. for(int j = ; j<=i; j++)
  40. {
  41. if(ok[j][i])
  42. dp[i] = max(dp[i],dp[j-]+a[i-j+]);
  43. }
  44.  
  45. printf("%lld\n",dp[len]);
  46. }
  47.  
  48. int main()
  49. {
  50. int T;
  51. scanf("%d",&T);
  52. while(T--)
  53. {
  54. scanf("%d",&n);
  55. for(int i = ; i<=n; i++)
  56. scanf("%lld",&a[i]);
  57.  
  58. scanf("%s", s+);
  59. len = strlen(s+);
  60.  
  61. init();
  62. solve();
  63. }
  64. return ;
  65. }

SCUT125 华为杯 D.笔芯回文 —— DP的更多相关文章

  1. 2017华南理工华为杯D bx回文

    比赛的时候队友过了,补补题XD. 题目链接:https://scut.online/p/125(赛后补题) 125. 笔芯回文     题目描述 bx有一个长度一个字符串S,bx可以对其进行若干次操作 ...

  2. SCUT 125 :笔芯回文(DP)

    https://scut.online/p/125 125. 笔芯回文 题目描述 bxbx有一个长度一个字符串SS,bxbx可以对其进行若干次操作. 每次操作可以删掉一个长度为k(1 \leq k \ ...

  3. NYOJ 1023 还是回文(DP,花最少费用形成回文串)

    /* 题意:给出一串字符(全部是小写字母),添加或删除一个字符,都会产生一定的花费. 那么,将字符串变成回文串的最小花费是多少呢? 思路:如果一个字符串增加一个字符 x可以形成一个回文串,那么从这个字 ...

  4. [51nod1503]猪和回文 DP

    ---题面--- 题解: 首先观察到题目要求的是合法回文串的个数,而回文串要求从前往后和从后往前是一样的,因此我们假设有两只猪,分别从左上和右下开始走,走相同的步数最后相遇,那么它们走的路能拼在一起构 ...

  5. 1503 猪和回文(DP)

    1503 猪和回文 题目来源: CodeForces 基准时间限制:2 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 一只猪走进了一个森林.很凑巧的是,这个森林的形状是长方形的,有 ...

  6. scut 125. 笔芯回文

    https://scut.online/p/125 看数据量,这题可能是O(n^2)的dp 也可能是区间dp,但是区间dp一般复杂度是O(n^3),虽然也可以优化,但是比赛的时候那么多人“秒”了,应该 ...

  7. 【LSGDOJ1383】修改回文 dp

    题目描述 为了跟踪所有的牛,农夫JOHN在农场上装了一套自动系统. 他给了每一个头牛一个电子牌号 当牛走过这个系统时,牛的名字将被自动读入. 每一头牛的电子名字是一个长度为M (1 <= M & ...

  8. 【蓝桥杯】PREV-21 回文数字

    题目链接:http://lx.lanqiao.org/problem.page? gpid=T113   历届试题 回文数字   时间限制:1.0s   内存限制:256.0MB      问题描写叙 ...

  9. Java实现蓝桥杯历届试题回文数字

    历届试题 回文数字 时间限制:1.0s 内存限制:256.0MB 提交此题 问题描述 观察数字:12321,123321 都有一个共同的特征,无论从左到右读还是从右向左读,都是相同的.这样的数字叫做: ...

随机推荐

  1. python安装numpy和matplotlib

    1.从该链接下载对应的whl文件 2.按照下面的方式从whl文件安装即可 windows7 python2.7 1.用管理员方式打开cmd 2.首先通过pip命令安装wheel 如果提示’pip’不是 ...

  2. 转载:P2P技术原理及应用(1)

    转帖allen303allen的空间 作 者:金海 廖小飞 摘要:对等网络(P2P)有3种主要的组织结构:分布式哈希表(DHT)结构.树形结构.网状结构.P2P技术已 经延伸到几乎所有的网络应用领域, ...

  3. Oracle中PL/SQL 范例

    1.写匿名块,输入三角形三个表的长度.在控制台打印三角形的面积 declare v_side_first ):=&第一条边; v_side_second ):=&第二条边; v_sid ...

  4. spring beans 接口

  5. 用hashmap实现自己的缓存

    @SuppressWarnings({"unchecked", "rawtypes"})public class DefaultCache implements ...

  6. GO语言_用redis作为url队列的爬虫

    // Copyright 2016 laosj Author @songtianyi. All Rights Reserved. // // Licensed under the Apache Lic ...

  7. Solaris Samba服务器与DNS服务

    用于文件传输的协议,类似于ftp,ssh,只是它比其他两个好用. Samba协议 NetBIOS :一种编程接口. SMB:server message block .主要作为Microsoft网络通 ...

  8. C中參数个数可变的函数

    一.什么是可变參数 我们在C语言编程中有时会遇到一些參数个数可变的函数,比如printf()函数,其函数原型为: int printf( const char* format, ...); 它除了有一 ...

  9. C++编译错误 2001 1120

    无法解析的外部符号"symbol" 代码引用了链接器无法在库和对象文件中找到的内容(如函数.变量或标签). 该错误信息之后为错误 LNK1120. 可能的原因 : 在将托管库或 W ...

  10. POJ 3335 Rotating Scoreboard(半平面交 多边形是否有核 模板)

    题目链接:http://poj.org/problem? id=3335 Description This year, ACM/ICPC World finals will be held in a ...