小美定义一个 01 串的权值为:每次操作选择一位取反,使得相邻字符都不相等的最小操作次数。
例如,"10001"的权值是 1,因为只需要修改一次:对第三个字符取反即可。
现在小美拿到了一个 01 串,她希望你求出所有非空连续子串的权值之和,你能帮帮她吗?
分析:
先从第一个位置考虑,后面确定递推式
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
void solve()
{
string s;
cin>>s;
ll sums=0;
ll n=s.size();
for(ll i=0;i<n;i++)
{
ll res=0;
ll f[2002][2];//0是不选,1是选
f[i][0]=0,f[i][1]=1;//开头转或者不转
for(ll j=i+1;j<n;j++)
{
if(s[j]==s[j-1])//如果相同
{
f[j][0]=f[j-1][1];
f[j][1]=f[j-1][0]+1;
}
else{
f[j][0]=f[j-1][0];
f[j][1]=f[j-1][1]+1;
}
sums+=min(f[j][0],f[j][1]);
}
}
cout<<sums<<'\n';
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
ll t=1;
while(t--)
solve();
return 0;
}