博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
scut 125. 笔芯回文
阅读量:5323 次
发布时间:2019-06-14

本文共 2094 字,大约阅读时间需要 6 分钟。

看数据量,这题可能是O(n^2)的dp

也可能是区间dp,但是区间dp一般复杂度是O(n^3),虽然也可以优化,但是比赛的时候那么多人“秒”了,应该不会是那么麻烦的。

套路:设dp[i]表示前i个字符中能拿到的最大贡献。dp[len]就是答案。

如果[L, R]这段区间能组成回文串,那么就有两种决策,删除或则不删除。

删除:dp[R] = dp[L - 1] + a[R - L + 1]

不:  dp[R] = dp[R];

取个max就行。

#include 
#include
#include
#include
#include
#include
#define IOS ios::sync_with_stdio(false)using namespace std;#define inf (0x3f3f3f3f)typedef long long int LL;#include
#include
#include
#include
#include
#include
#include
#include
const int maxn = 1e5 + 20;int a[maxn];LL dp[maxn];char str[maxn], sub[maxn];int p[maxn];int manacher(char str[], int lenstr) { str[0] = '*'; //表示一个不可能的值 //目标要插入lenstr+1个'#',所以长度变成2*lenstr+1 for (int i = lenstr; i >= 0; i--) { //str[lenstr+1]是'\0' //i=lenstr时,i+i+2那个值要赋为'\0'; //总长度只能是lenstr+lenstr+2,所以i从lenstr开始枚举 str[i + i + 2] = str[i + 1]; str[i + i + 1] = '#'; } int id = 0, maxlen = 0; //现在开始在str[2]了 for (int i = 2; i <= 2 * lenstr + 1; i++) { //2*lenstr+1是'#'没用 if (p[id] + id > i) { //没取等号的,只能去到p[id]+id-1 //p[id]+id是越界的,减去i即为区间长度 //p[id]+id-i,这个是所有可能中的最大值了 p[i] = min(p[id] + id - i, p[2 * id - i]); } else p[i] = 1; //记得修改的是p[i] while (str[i + p[i]] == str[i - p[i]]) ++p[i]; if (p[id] + id < p[i] + i) id = i; maxlen = max(maxlen, p[i]); } return maxlen - 1;}bool isok(int be, int en) { int len = en - be + 1; be <<= 1; en <<= 1; int mid = (be + en) >> 1; return p[mid] - 1 >= len;}void work() { int n; cin >> n; for (int i = 1; i <= n; ++i) cin >> a[i]; memset(dp, 0, sizeof dp); cin >> str + 1; int lenstr = strlen(str + 1); strcpy(sub + 1, str + 1); manacher(str, lenstr); for (int i = 1; i <= lenstr; ++i) { for (int j = 1; j <= i; ++j) { if (i - j + 1 > n) continue; if (isok(j, i)) { dp[i] = max(dp[i], dp[j - 1] + a[i - j + 1]); } } } cout << dp[lenstr] << endl;}int main() {#ifdef local freopen("data.txt", "r", stdin);// freopen("data.txt", "w", stdout);#endif int t; cin >> t; while (t--) work(); return 0;}
View Code

 

转载于:https://www.cnblogs.com/liuweimingcprogram/p/6786544.html

你可能感兴趣的文章
【理财】关于理财的网站
查看>>
Ubunt中文乱码
查看>>
《当幸福来敲门》读后
查看>>
【转】系统无法进入睡眠模式解决办法
查看>>
省市县,循环组装,整合大数组
查看>>
Phpstorm中使用SFTP
查看>>
stm32中字节对齐问题(__align(n),__packed用法)
查看>>
like tp
查看>>
posix多线程有感--线程高级编程(线程属性函数总结)(代码)
查看>>
spring-使用MyEcilpse创建demo
查看>>
DCDC(4.5V to 23V -3.3V)
查看>>
kettle导数到user_用于left join_20160928
查看>>
activity 保存数据
查看>>
typescript深copy和浅copy
查看>>
linux下的静态库与动态库详解
查看>>
hbuilder调底层运用,多张图片上传
查看>>
深入理解基于selenium的二次开发
查看>>
较快的maven的settings.xml文件
查看>>
Git之初体验 持续更新
查看>>
Exception in thread "AWT-EventQueue-0" java.lang.IllegalThreadStateException
查看>>