小美定义一个 01 串的权值为:每次操作选择一位取反,使得相邻字符都不相等的最小操作次数。 例如,”10001″的权值是 1,因为只需要修改一次:对第三个字符取反即可。 现在小美拿到了一个 01 串,她希望你求出所有非空连续子串的权值之和,你能帮帮她吗?
区块链毕设网qklbishe.com为您提供问题的解答
小美定义一个 01 串的权值为:每次操作选择一位取反,使得相邻字符都不相等的最小操作次数。
例如,”10001″的权值是 1,因为只需要修改一次:对第三个字符取反即可。
现在小美拿到了一个 01 串,她希望你求出所有非空连续子串的权值之和,你能帮帮她吗?
有问题,暂时不知bug
#include <iostream>
#include <vector>
using namespace std;
intmain() {
string s;
intsum=0;
cin>>s;
vector<vector<int>> dp(s.size()+1,vector<int>(s.size(),0));
for(inti=1;i<s.size();i++){
if(s[i-1]==s[i]){
dp[2][i-1]=1;
}
}
for(inti=3;i<=s.size();i++){
for(intj=0;j<s.size()-i+1;j++){
if(s[j+i-2]==s[j+i-1]&&s[j+i-3]!=s[j+i-1]){
dp[i][j]=dp[i-1][j]+1;
}
elseif(i>=4&&s[j+i-2]==s[j+i-1]&&s[j+i-3]==s[j+i-1]&&s[j+i-4]==s[j+i-1]){
dp[i][j]=dp[i-1][j]+1;
}
else{
dp[i][j]=dp[i-1][j];
}
}
}
for(inti=2;i<s.size()+1;i++){
for(intj=0;j<s.size();j++){
sum+=dp[i][j];
}
}
cout<<sum<<endl;
}
13:52
以上就是关于问题小美定义一个 01 串的权值为:每次操作选择一位取反,使得相邻字符都不相等的最小操作次数。
例如,”10001″的权值是 1,因为只需要修改一次:对第三个字符取反即可。
现在小美拿到了一个 01 串,她希望你求出所有非空连续子串的权值之和,你能帮帮她吗?的答案
欢迎关注区块链毕设网-
专业区块链毕业设计成品源码,定制。
区块链NFT链游项目方科学家脚本开发培训