Codeforces Round #107 (Div. 1) D. Mission Impassable

本文介绍了一道关于字符串操作及动态规划的算法题,玩家通过删除回文子串获得分数,目标是最大化总分。文章提供了详细的解题思路与代码实现。
D. Mission Impassable
time limit per test
3 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Market stalls now have the long-awaited game The Colder Scrools V: Nvodsk. The game turned out to be difficult as hell and most students can't complete the last quest ("We don't go to Nvodsk..."). That threatened winter exams. The rector already started to wonder whether he should postpone the winter exams till April (in fact, he wanted to complete the quest himself). But all of a sudden a stranger appeared at the door of his office. "Good afternoon. My name is Chuck and I solve any problems" — he said.

And here they are sitting side by side but still they can't complete the mission. The thing is, to kill the final boss one should prove one's perfect skills in the art of managing letters. One should be a real magician to do that. And can you imagine what happens when magicians start competing...

But let's put it more formally: you are given a string and a set of integers ai. You are allowed to choose any substring that is a palindrome and delete it. At that we receive some number of points equal to ak, where k is the length of the deleted palindrome. For some kak = -1, which means that deleting palindrome strings of such length is forbidden. After a substring is deleted, the remaining part "shifts together", that is, at no moment of time the string has gaps. The process is repeated while the string has at least one palindrome substring that can be deleted. All gained points are summed up.

Determine what maximum number of points can be earned.

"Oh" — said Chuck, raising from the chair, — "I used to love deleting palindromes, just like you, but one day I took an arrow in the Knee".

Input

The first line contains an integer l (1 ≤ l ≤ 150) — the length of the string.

The second line contains exactly l integers ak ( - 1 ≤ ak ≤ 105) — the points a player gains for deleting.

The third line contains exactly l lowercase Latin letters — the original string from which a player can delete palindromes. The line contains no other characters apart from the newline character at the end of the string.

Output

Print a single number — the maximum number of points one can gain if he plays on the given string.

Sample test(s)
input
7
-1 -1 -1 -1 -1 -1 -1
abacaba
output
0
input
7
1 -1 -1 -1 -1 -1 -1
abacaba
output
7
input
7
1 5 -1 -1 -1 -1 10
abacaba
output
16
Note

In the first sample we cannot delete any substring, so the best result is 0. In the second sample we are allowed to delete only those palindromes whose length equals 1, thus, if we delete the whole string, we get 7 points. In the third sample the optimal strategy is: first we delete character c, then string aa, then bb, and the last one aa. At that we get 1 + 3 * 5 = 16 points.

题意:对于一个字符串,你可以如果它有一个长度为len 的子串,如果 a[len] != -1 那么,你就可以选择删除它,然后得到a[len]分数

,然后串会合并成新串....你又可以重复上面做法,直到不能做

思路:dp[x][y][z] 表示,对于子串 str[x~y] 删除 z 个字符以后可以得到的最大价值,

注意边界条件就好了。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<map>
#include<ctime>
#include<bitset>
#define LL long long
#define ll long long
#define INF 4365899
#define maxn 152
#define eps 1e-6
#define mod 1000000007
using namespace std;

int a[maxn],dp[maxn][maxn][maxn] ;
char str[maxn] ;
int dfs(int x,int y,int z)
{
    if(dp[x][y][z] != -1) return dp[x][y][z] ;
    if(x==y&&z==1)
    {
        dp[x][y][z]=0 ;
        return 0 ;
    }
    if(x==y+1 && z==0){
        dp[x][y][z]=0;
        return dp[x][y][z];
    }
    dp[x][y][z]=-INF;
    if(z<0||z>y-x+1) return -INF ;
    if(z==0)
    {
        int Max=-INF;
        for(int i = 1 ; i <= y-x+1;i++)if(a[i]!=-1)
        {
            Max=max(Max,dfs(x,y,i)+a[i]) ;
        }
        dp[x][y][z]=Max;
        return Max;
    }
    int d;
    if(str[x]==str[y])
    {
        d = dfs(x+1,y-1,z-2);
        dp[x][y][z]=max(d,dp[x][y][z]) ;
    }
    for(int i = x ; i< y ;i++)
    {
        d = dfs(x,i,z)+dfs(i+1,y,0) ;
        dp[x][y][z]=max(d,dp[x][y][z]) ;
        d = dfs(x,i,0)+dfs(i+1,y,z) ;
        dp[x][y][z]=max(d,dp[x][y][z]) ;
    }
    return dp[x][y][z] ;
}
int ans[maxn] ;
int main()
{
    int i,j,L,R,cnt;
    int n ,m , k ;
    while(scanf("%d",&n ) != EOF )
    {
       for( i = 1 ; i <= n ;i++)
         scanf("%d",&a[i]) ;
       memset(dp,-1,sizeof(dp)) ;
       ans[0]=0;
       scanf("%s",str+1) ;
       for( i = 1 ; i <= n ;i++)
       {
           ans[i]=ans[i-1];
           for( j= 1;j<=i;j++)
            ans[i]=max(ans[i],ans[j-1]+dfs(j,i,0));
       }
       cout<<ans[n]<<endl;
    }
    return 0 ;

}
View Code

 

 

转载于:https://www.cnblogs.com/20120125llcai/p/4060614.html

【源码免费下载链接】:https://renmaiwang.cn/s/38gy7 从技术角度而言,MQTT(Message Queuing Telemetry Transport)作为一种轻量级的消息传输协议,在信息技术领域具有重要地位。它被广泛应用于物联网(IoT)设备之间实现信息传递中,起到关键作用。该协议采用发布-订阅模式,确保各参与方能够快速、准确地交换数据信息。基于这一特点,Apache基金会提供的一个开源的消息路由组件——ActiveMQ,成为许多系统的核心选择。为了满足开发需求,我们推荐使用`mqttjs`库,它为JavaScript语言提供了MQTT客户端的实现,并支持与ActiveMQ服务器之间的交互测试。该库采用轻量化设计,在Web应用和Node.js平台中都能良好运行。安装过程简便快捷,只需在Node.js命令行环境中执行以下操作:```bashnpm install mqtt```随后,通过编写如下的JavaScript代码片段,即可建立一个基本的 MQTT客户端连接到ActiveMQ服务器:const mqtt = require(mqtt);const client = mqtt.connect(&#39;mqtt://your.active.mq.server:1883&#39;);client.on(connect, (res) => { console.log(&#39;已成功与ActiveMQ服务器建立连接&#39;)});// 发布消息client.publish(&#39;test/topic&#39;, &#39;Hello, MQTT World!&#39;);// 订阅主题client.subscribe(&#39;test/topic&#39;);// 设置接收到的消息回调函数,打印相关信息console.log(...);// 关闭连接操作完成时的回调函数通过这种方式,我们能够模拟多个客户端的行为模式,
【源码免费下载链接】:https://renmaiwang.cn/s/qiemp 深度学习中,常常要获取文件夹下文件名和类别,为提取训练数据和测试数据准备本文采用的一个文件下的40类数据做实验:最后保存成如下文件形式: 文件路径+文件名+类别标签具体代码如下:# -*- coding: utf-8 -*-"""Created on Sat Mar 21 10:51:04 2020filenameToCSV@author: administration"""import osimport reallpath=[]allname=[]#获取文件列表def getallfile(path): allfilelist=os.listdir(在深度学习领域,数据预处理是至关重要的一步,特别是当数据分布在多个子文件夹中时。这个场景中,我们需要从一个包含多级子文件夹的结构中递归地收集文件名,并同时获取每个文件对应的类别标签。这通常用于构建训练集和测试集,以便进行模型的训练和评估。以下是对给定的Python代码的详细解释:我们导入了两个必要的库:`os`和`re`。`os`库提供了与操作系统交互的接口,包括读取目录、检查文件类型等;而`re`库则用于正则表达式操作,用于在文件路径中提取类别标签。代码定义了一个名为`getallfile`的函数,其作用是递归遍历指定路径下的所有子目录和文件。函数接收一个参数`path`,即要开始遍历的目录路径。`os.listdir(path)`用于获取`path`路径下的所有文件和子目录名,然后通过`for`循环逐个处理。对于循环中的每个文件或子目录,`os.path.join(path, file)`用来构造完整的文件或子目录路径。如果路径表示的是一个子目录,`os.path.isdir(filepath)`将返回`True`,此时调用`
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值