这是我的第一篇博客额。
今天花了一下午时间折腾这道题,并不是因为题有多难,而是因为花了很多时间去寻找优化算法,结果无功而返。最后还是用蛮力法AC过了。算发思路就是遍历插入地点和插入字符,计算出所有情况下的字符数,输出最大消除字符个数。
废话不说,直接上代码,希望时间比我少的同学能分享一下代码。
#include<iostream>
#include<string>
using namespace std;
/*
输入:一个字符串的引用
输出:按照消除规则消除的字符数
说明:由于参数为引用类型,函数会破坏输入字符串
*/
int getResult(string &s)
{
int ol = s.length();
int i = 0, flag = 1;
while (flag == 1)
{
flag = 0;
while (i < s.length())
{
if (s[i] == s[i + 1])
{
while (s[i] == s[i + 1])
s.erase(i + 1, 1);
s.erase(i, 1);
flag = 1;
}
else
i++;
}
i = 0;
}
return ol - s.length();
}
/*
输入:s一个字符串,第i个字符后面,添加字符c
输出:返回按照消除规则的消除字符个数
说明:函数功能为计算在s字符串的i个字符后添加指定字符c所形成的字符串按照消除规则消除的字符个数
*/
int getWithAddChar(string s, int i, char c)
{
s.insert(i, 1, c);
return getResult(s);
}
/*
输入:s一个字符串的引用,i添加字符位置
输出:按照消除规则消除如果在第i个字符后添加字符的最大字符数
说明:函数功能为计算在s字符串的i个字符后添加所有可能的字符后,最大的消除字符个数
*/
int getWithAddPos(string &s, int i)
{
int maxn = 0, ct = 0;
for (char x = 'A'; x < 'D'; x++)
{
ct = getWithAddChar(s, i, x);
if (ct>maxn)
maxn = ct;
}
return maxn;
}
/*
输入:s一个字符串的引用
输出:按照添加和消除规则所消除的最大字符数
说明:
*/
int getWithAddStrategy(string &s)
{
int maxn = 0, ct = 0;
for (int i = 0; i <= s.length(); i++)
{
ct = getWithAddPos(s, i);
if (ct > maxn)
maxn = ct;
}
return maxn;
}
int main()
{
int x, y;
string *s;
cin >> y;
x = y;
//根据第一行输入分配内存
if (cin&&x > 0)
s = new string[x];
else return -1;
while (cin&&x && (x<101))
{
//输入字符串
cin >> s[--x];
//输入检查
for (int i = 0; i < s[x].length(); i++)
{
if (s[x][i]<'A' || s[x][i]>'C')
return -1;
}
if (s[x].length()>100)
return -1;
}
//计算并输出
for (x = y - 1; x >= 0; --x)
cout << getWithAddStrategy(s[x]) << endl;
//释放内存
delete[] s;
return 0;
}