hdu_round3-1003.bx回文(manacher+dp)
来源:互联网 发布:淘宝品牌调性分怎么查 编辑:程序博客网 时间:2024/05/22 12:56
记录一个菜逼的成长。。
bx回文
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)
Total Submission(s): 501 Accepted Submission(s): 89
Problem Description
bx有一个长度一个字符串S,bx可以对其进行若干次操作。
每次操作可以删掉一个长度为k(1 <= k <= n)的连续回文子串,bx获得ak的愉悦值。
一个字符串是回文串当且仅当正读和反读都是一样的。例如”a”,”aa”,”abcba”是回文串,”ab”,”abc”,”aabab”不是回文串。
字符串删除之后相邻的字符不会合并在一起。
现在,bx想知道他最多能获得多少愉悦值。
Input
输入第一行一个整数T,表示数据组数。
对于每组数据,第一行一个整数n。
第二行n个整数,第i个表示ai。
第三行为字符串S。
1 <= T <= 20
1 <= n <= |S| < 5000
0 <= ai < 1000000000
S只包括小写字母。
Output
对每组数据,输出bx所能获得的最大愉悦值。
Sample Input
2
3
1 2 3
aba
3
3 2 1
aba
Sample Output
3
9
用
考虑
有如下转移:
以第
ps:要对a数组进行清零,因为
#include <stdio.h>#include <string.h>#include <algorithm>using namespace std;#define ALL(v) (v).begin(),(v).end()#define cl(a,b) memset(a,b,sizeof(a))#define clr clear()#define pb push_back#define mp make_pair#define fi first#define se secondtypedef long long LL;typedef pair<int,int> PII;const int INF = 0x3f3f3f3f;const int maxn = 20000 + 10;char str[maxn],str1[maxn];int a[maxn],p[maxn];LL dp[maxn];void change(char s[],char s1[]){ int i,j=0; s1[0]='!'; s1[1]='#'; for( i = 2; s[j]; i += 2 ){ s1[i] = s[j++]; s1[i+1] = '#'; } s1[i] = '\0';}void manacher(char s1[]){ int ret = 0; memset(p,0,sizeof(p)); int i,id=0,mx=0; for( i = 1; s1[i]; i++ ){ if(mx>i)p[i]=min(p[2*id-i],mx-i); else p[i]=1; while(s1[i-p[i]]==s1[i+p[i]]) p[i]++; if(i+p[i]>mx){ mx=i+p[i]; id=i; } }}int main(){ int T;scanf("%d",&T); while(T--){ int n; scanf("%d",&n); cl(a,0); for( int i = 1; i <= n; i++){ scanf("%d",a+i); } scanf("%s",str); int l = strlen(str); change(str,str1); manacher(str1); int len1 = strlen(str1); cl(dp,0); for( int i = 1; i < len1; i ++ ){ int len = p[i] - 1; for( int j = 0; j <= len; j++ ){ dp[i+j] = max(dp[i+j],dp[i-j-1] + ( str1[i] != '#' ? a[j/2*2+1] : a[(j+1)/2*2] ) ); } } printf("%lld\n",dp[len1-1]); } return 0;}
- hdu_round3-1003.bx回文(manacher+dp)
- bx回文(dp 杭电排位赛-6)
- hdu4513 最长递增回文序列 manacher + dp
- [bzoj2565][manacher][DP]最长双回文串
- 回文(manacher)
- 51NOD 1154 回文串划分 【DP+Manacher】
- Manacher:最长回文
- manacher算法 解决回文
- 【Manacher 算法 回文串】
- Manacher求最长回文
- 回文字符串--manacher算法
- 【HDU3068】最长回文【manacher】
- MANACHER最长回文算法
- Manacher(回文字符串)
- HDU3068 最长回文 manacher
- MANACHER 最长回文序列
- HDOJ3068 最长回文(Manacher)
- 回文串---manacher算法
- 同源策略和跨域访问
- JavaScript将input file的选择的文件清空的两种解决方案
- All sentinels down, cannot determine where is mymaster master is running
- spring源码附录(1)java实现对XML格式的验证
- 基本算法之堆排序
- hdu_round3-1003.bx回文(manacher+dp)
- git常用命令
- jstl fmt标签笔记
- 华为机试——明明的随机数
- Linux常用命令清单
- 用多线程进行的序列快速排序
- 51 nod 1212 基础MST
- Service的两种启动方式
- 小船过河问题