我这代码哪里出错了?
  • 板块学术版
  • 楼主qilian_mountain
  • 当前回复1
  • 已保存回复1
  • 发布时间2024/9/5 21:53
  • 上次更新2024/9/6 12:59:12
查看原帖
我这代码哪里出错了?
718762
qilian_mountain楼主2024/9/5 21:53

需要解决的问题为ccf 2024年6月认证 C++ 6级 编程题1

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

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

例如,假设 n=3
,字符串 dabcabcabcabzabc 的所有可能计分方式如下:

d+abc+abcabc+abz+abc 或者 d+abcabc+abc+abz+abc,其中 d 和 abz 不计算得分,总得分为 a1+a2+a1
d+abc+abc+abc+abz+abc,总得分为 a1+a1+a1+a1
d+abcabcabc+abz+abc,总得分为 a3+a1
小杨想知道对于给定的字符串,最大总得分是多少。

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

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

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

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

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

样例1
3
3 1 2
13
dabcabcabcabz
9

我的代码:

#include<bits/stdc++.h>
using namespace std;
string s;
int n, m, aa[20];
int dp[100005];
struct node
{
	int id;
	bool near;
};
vector<node>exist;
int main()
{
	cin.sync_with_stdio(0);
	cin >> n;
	for (int i = 1; i <= n; i++)
		cin >> aa[i];
	cin >> m;
	cin >> s;
	for (int i = 0; i < m; i++)
	{
		if (s.substr(i, 3) == "abc")
			if (i - 3 > 0)
			{
				if (s.substr(i - 3, 3) == "abc")
					exist.push_back({ i / 3 ,1 });
				else
					exist.push_back({ i / 3,0 });
			}
			else
				exist.push_back({ i / 3 , 1 });
	}
	for (int i = 0; i < exist.size(); i++)
	{
		if (i - 1 >= 0)
			dp[i] = dp[i - 1];
		for (int j = 1; j <= n; j++)
		{
			if (i - j + 1 < 0)
				break;
			if (exist[i - j + 1].near)
				dp[i] = max(dp[i], dp[i - j + 1] + aa[j]);
			else
				break;
		}
	}
	cout << dp[exist.size() - 1] << endl;
}

在输入 2 1 1145 12 abcabcabcadd 时出错
推测可能是无法解决重叠计数的问题

2024/9/5 21:53
加载中...