状态表示及属性:在[l,r]区间内满足条件的数量
状态计算:
if(s[l]>s[r])dp[l][r]=1;
else if(s[l]==s[r])dp[l][r]=dp[l+1][r-1];
#include<bits/stdc++.h>
using namespace std;
const int N=5e3+10;
int n,dp[N][N],res;
int main(){
string s;
cin>>s;
n=s.size();
for(int len=2;len<=n;++len){
for(int l=0;l+len-1<n;++l){
int r=l+len-1;
if(s[l]>s[r])dp[l][r]=1;
else if(s[l]==s[r])dp[l][r]=dp[l+1][r-1];
res += dp[l][r];
}
}
cout<<res<<endl;
return 0;
}
暴力枚举,头尾相同就往里收缩
#include<bits/stdc++.h>
using namespace std;
string a;
int main()
{
cin>>a;
int ans = 0;
for(int i = 0;i<a.size();i++)
{
for(int j = i+1;j<a.size();j++)
{
if(a[i] > a[j])ans++;
else if(a[i] == a[j])
{
int t1 = i,t2 = j;
while(a[i] == a[j] && i<j)
{
i++;j--;
if(a[i] < a[j])break;
if(a[i] > a[j])
{
ans++;
break;
}
}
i = t1,j = t2;
}
}
}
cout<<ans<<endl;
return 0;
}