设为首页 收藏本站
查看: 1205|回复: 0

[经验分享] 2017华南理工华为杯D bx回文

[复制链接]

尚未签到

发表于 2017-7-10 18:11:59 | 显示全部楼层 |阅读模式
  比赛的时候队友过了,补补题XD。
  题目链接:https://scut.online/p/125(赛后补题)











125. 笔芯回文















题目描述


  bx有一个长度一个字符串S,bx可以对其进行若干次操作。
  每次操作可以删掉一个长度为k(1≤k≤n)的连续回文子串,bx获得a​k​​的愉悦值。
  一个字符串是回文串当且仅当正读和反读都是一样的。例如"a", "aa", "abcba""a","aa","abcba"是回文串,"ab", "abc","aabab""ab","abc","aabab"不是回文串。
  字符串删除之后相邻的字符不会合并在一起。
  现在,bx想知道他最多能获得多少愉悦值。



输入格式


  输入第一行一个整数T,表示数据组数。
  对于每组数据,第一行一个整数n。
  第二行n个整数,第i个表示a​i​​。
  第三行为字符串S。
  1≤T≤20
  1≤n≤∣S∣≤5000
  0≤a​i​​≤1000000000
  SS只包括小写字母。


输出格式


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


样例数据


  输入

2
3
1 2 3
aba
3
3 2 1
aba
  输出

3
9


备注
  题解:
  简单的dp题目。用n^2枚举回文串。(ok[j]为第i位到第j为的字符为回文串)
  dp为第i位结尾的最大愉悦值。
  找动态转移方程:当第j个开始到第i个位回文串的时候 dp = max(dp[j-1]+a[i到j的距离], dp)。j在[1, i-1]。


DSC0000.gif DSC0001.gif


#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <string>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <sstream>
#include <algorithm>
using namespace std;
#define pb push_back
#define mp make_pair
#define ms(a, b)  memset((a), (b), sizeof(a))
//#define LOCAL
#define eps 0.0000001
typedef long long LL;
const int inf = 0x3f3f3f3f;
const LL INF = 0x7fffffff;
const int maxn = 5000+10;
const int mod = 1000000007;
char s[maxn];
LL a[maxn];
int ok[maxn][maxn];
LL dp[maxn];
void init()
{
     ms(s, 0);
     ms(ok, 0);
     ms(dp, 0);
}
void solve()
{
     int n;
     scanf("%d", &n);
     for(int i = 1;i<=n;i++)     scanf("%lld", &a);
     scanf("%s", s+1);
     int len = strlen(s+1);
//    printf("%d\n", len);
     for(int i=1;i<=len;i++){//判断奇数时逝世后为回文串
         ok = 1;
         for(int j = 1;;j++){
             if(( j*2 + 1) > n || i-j <1 || i+j > len )  break;//回文串的长度要小于等于n
             if(s[i-j] == s[i+j]){
                 ok[i-j][i+j] = 1;
             }else    break;
         }
     }
     for(int i = 1;i<=len;i++){//判断偶数个时是否为回文串
         if(s != s[i+1])  continue;
         ok[i+1] = 1;
         for(int j = 1;;j++){
             if( i-j < 1|| i+1+j > len || j*2+2 > n)   break;//回文串的长度要小于等于n
             if(s[i-j] == s[i+1+j]){
                 ok[i-j][i+1+j] = 1;
             }else    break;
         }
     }
     dp[1] = a[1];
     for(int i=2;i<=len;i++){
         dp = max(dp, dp[i-1]+a[1]);
         for(int j = 1;j<i;j++){
             if(ok[j]){
                 dp = max(dp, dp[j-1]+a[i-j+1]);
             }
         }
     }
     printf("%lld\n", dp[len]);
}
int main() {
#ifdef LOCAL
     freopen("input.txt", "r", stdin);
//      freopen("output.txt", "w", stdout);
#endif // LOCAL
//    ios::sync_with_stdio(0);
//    cin.tie();
     int T;
     scanf("%d", &T);
     while(T--){
         init();
         solve();
     }
     return 0;
}
View Code  你努力的时候,比你厉害的人也在努力。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-392480-1-1.html 上篇帖子: v模拟器(华为、H3C)点滴 下篇帖子: 华为 Mate8 Emui 5.0 安卓 7.0 root 记录
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表