二次题解,必懂
2025-11-25 19:36:57
发布于:浙江
8阅读
0回复
0点赞
#include<bits/stdc++.h>//这必须懂,原代码基础上给你修改了一下
using namespace std;
int main(){
// 读入计分序列长度n
int n;
cin>>n;
// 计分数组a,a[k]表示连续k个"abc"的得分
vector<int> a(n+1);
for(int i=1;i<=n;i++) cin>>a[i];
// 读入字符串长度m和字符串s
int m;
string s;
cin>>m>>s;
// dp[i]表示前i个字符能获得的最大得分
vector<long long> dp(m+1,0);
// 遍历字符串的每个位置
for(int i=0;i<m;i++){
// 情况1:不选取以当前位置开始的"abc"序列,直接继承前一个位置的最大得分
dp[i+1]=max(dp[i+1],dp[i]);
// 检查从位置i开始是否是"abc"
if(i+2<m&&s.substr(i,3)=="abc"){
int k=1; // 当前尝试的连续"abc"个数
// 尝试连续k个"abc",k从1到n
while(k<=n&&i+3*k<=m){
bool ok=true; // 标记是否连续k个都是"abc"
// 检查接下来的k个"abc"是否都连续
for(int j=0;j<k;j++){
// 检查第j个"abc"是否匹配
if(s.substr(i+3*j,3)!="abc"){
ok=false;
break;
}
}
// 如果连续k个都是"abc",更新dp值
if(ok){
dp[i+3*k]=max(dp[i+3*k],dp[i]+a[k]);
}else{
break; // 如果不连续,后面的k更大也不会连续,直接退出
}
k++; // 尝试更多的连续"abc"
}
}
}
// 输出整个字符串的最大得分
cout<<dp[m];
return 0;
}
这里空空如也




有帮助,赞一个