当前位置: 首页 > article >正文

gesp(C++六级)(9)洛谷:P10721:[GESP202406 六级] 计算得分

gesp(C++六级)(9)洛谷:P10721:[GESP202406 六级] 计算得分

在这里插入图片描述

题目描述

小杨想要计算由 m m m 个小写字母组成的字符串的得分。

小杨设置了一个包含 n n n 个正整数的计分序列 A = [ a 1 , a 2 , … , a n ] A=[a_1,a_2,\ldots,a_n] A=[a1,a2,,an],如果字符串的一个子串由 k ( 1 ≤ k ≤ n ) k(1\leq k \leq n) k(1kn) abc \texttt{abc} abc 首尾相接组成,那么能够得到分数 a k a_k ak,并且字符串包含的字符不能够重复计算得分,整个字符串的得分是计分子串的总和。

例如,假设 ,字符串 dabcabcabcabzabc \texttt{dabcabcabcabzabc} dabcabcabcabzabc 的所有可能计分方式如下:

  • d+abc+abcabc+abz+abc \texttt{d+abc+abcabc+abz+abc} d+abc+abcabc+abz+abc 或者 d+abcabc+abc+abz+abc \texttt{d+abcabc+abc+abz+abc} d+abcabc+abc+abz+abc,其中 d \texttt{d} d abz \texttt{abz} abz 不计算得分,总得分为 a 1 + a 2 + a 1 a_1+a_2+a_1 a1+a2+a1
  • d+abc+abc+abc+abz+abc \texttt{d+abc+abc+abc+abz+abc} d+abc+abc+abc+abz+abc,总得分为 a 1 + a 1 + a 1 + a 1 a_1+a_1+a_1+a_1 a1+a1+a1+a1
  • d+abcabcabc+abz+abc \texttt{d+abcabcabc+abz+abc} d+abcabcabc+abz+abc,总得分为 a 3 + a 1 a_3+a_1 a3+a1

小杨想知道对于给定的字符串,最大总得分是多少。

输入格式

  • 第一行包含一个正整数 n n n,代表计分序列 A A A 的长度。

  • 第二行包含 n n n 个正整数,代表计分序列 A A A

  • 第三行包含一个正整数 m m m,代表字符串的长度。

  • 第四行包含一个由 m m m 个小写字母组成的字符串。

输出格式

输出一个整数,代表给定字符串的最大总得分。

样例 #1

样例输入 #1

3
3 1 2
13
dabcabcabcabz

样例输出 #1

9

提示

样例解释

最优的计分方式为 d+abc+abc+abc+abz \texttt{d+abc+abc+abc+abz} d+abc+abc+abc+abz,总得分为 a 1 + a 1 + a 1 a_1+a_1+a_1 a1+a1+a1,共 9 9 9 分。

数据范围

子任务编号数据点占比 n n n m m m a i a_i ai特殊性质
1 1 1 20 % 20\% 20% 20 20 20 1 0 5 10^5 105 1000 1000 1000
2 2 2 40 % 40\% 40% 3 3 3 1 0 5 10^5 105 1000 1000 1000
3 3 3 40 % 40\% 40% 20 20 20 1 0 5 10^5 105 1000 1000 1000

对于全部数据,保证有 1 ≤ n ≤ 20 1\leq n\leq 20 1n20 1 ≤ m ≤ 1 0 5 1\leq m\leq 10^5 1m105 1 ≤ a i ≤ 1000 1\leq a_i\leq 1000 1ai1000

AC代码(100分)

#include<bits/stdc++.h>
using namespace std;
/*思路: 
	动态规划:
	1、dp[i]含义:以第i个字符结尾的最大总得分 
	2、状态转移方程:
	   dp[i]=max(dp[i],dp[i-3*j]+a[j]);
	   备注1:j表示连续"abc"的个数
	   备注2:需满足条件i>=3*j,避免数组越界
	   备注3:a[j]表示j个abc首尾相接能够得到的分数 
*/
int n,m,a[30],dp[100010]; 
string s;
//判断函数:判断子串是不是连续的abc首尾相接 
bool check(string s){
	for(int i=2;i<s.size();i+=3){
		if(s.substr(i-2,3)!="abc") return false;
	}
	return true;
} 
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	cin>>m;
	cin>>s;
	//dp 
	for(int i=3;i<=m;i++){//枚举字符串的结尾字符(以1、2结尾没意义:不可能构成"abc") 
		dp[i]=dp[i-1];//dp[i]初始化 
		for(int j=1;j<=n;j++){//枚举"abc"首尾相接的个数,题目给定的最多n个 
			if(i>=3*j){
				string s2=s.substr(i-3*j,3*j);//截取子串,长度为3*j 
				if(check(s2)){//如果长度为3*j的子串s2是j个连续的"abc"串 
					dp[i]=max(dp[i],dp[i-3*j]+a[j]);//状态转移方程 
				} 
			}
		}
	}
	//输出答案
	cout<<dp[m]; 
	return 0;
}

文末彩蛋:

点击王老师青少年编程主页有更多精彩内容


http://www.kler.cn/a/528836.html

相关文章:

  • vim的特殊模式-可视化模式
  • 前端面试笔试题目(一)
  • 浅析DNS污染及防范
  • git基础使用--1--版本控制的基本概念
  • 【基于SprintBoot+Mybatis+Mysql】电脑商城项目之用户注册
  • 力扣动态规划-16【算法学习day.110】
  • UE学习日志#18 C++笔记#4 基础复习4 指派初始化器和指针
  • 手写防抖函数、手写节流函数
  • 【Rust自学】18.1. 能用到模式(匹配)的地方
  • Python在线编辑器
  • Python 环境隔离和实现方法
  • 【LeetCode 刷题】二叉树-公共祖先
  • TensorFlow简单的线性回归任务
  • OpenAI推出o3-mini推理模型,首次免费开放,性能超越o1,AIME测试准确率高达87.3%
  • 牛客题目分享:JZ64 求1+2+3+...+n(用static成员和构造函数的方法)(C++)
  • 记6(人工神经网络
  • 数据结构:优先级队列—堆
  • C++ strcpy和strcat讲解
  • NeetCode刷题第19天(2025.1.31)
  • 二、CSS笔记
  • 掌握API和控制点(从Java到JNI接口)_35 JNI开发与NDK 03
  • Hot100之子串
  • [AI]安装open-webui时报部分安装失败
  • C++:虚函数与多态性习题
  • [ACTF2020 新生赛]Exec 1
  • 记忆力训练day11