字串分值和
2020 蓝桥杯真题 字串分值和
采用动态规划的思路,f[n] 表示前n个字符的字串分值和
列如计算abc的结果,会用到ab的结果.从ab变换到abc会多出abc, bc, c
三个新的子串.我们只需要分别计算多出来的子串的值,并与ab的子串分值和相加即可.
#include <iostream>
#include <string>
#include <set>
using namespace std;
int f[100]; //f[n]表示前n个字符的字串分值和
int Count(string str)
{
set<char> s; //利用set天然排重的特性计算该字串的字符数
for (int i = 0; i < str.size(); i++){
s.insert(str[i]);
}
return s.size();
}
int dp(string str)
{
int n = str.size();
f[0] = 0;
for (int i = 1; i <= n; i++){ //开始遍历
f[i] = f[i - 1];
for (int k = 0; k < i; k++){ //计算加上一个字符后增加的字串
string temp = string(str, k, i - k);//temp为多出来的新子串
f[i] += Count(temp);
}
}
return f[n];
}
int main()
{
string str;
cin >> str;
cout << dp(str);
return 0;
}
第一次写,思路表达不是很清晰.见谅