题目链接:更小的数 - 洛谷 P9232 - Virtual Judge (vjudge.net)
解题思路:这个题看数据量是可以过n方的算法的,首先考虑dp,那么则是两层for循环,即枚举所有情况,那么怎么进行状态转移呢,当 s[i]>s[j] 时,将中间的子串翻转才可以使其变小,当 s[i]=s[j] 的时候,其翻转是否可以使字符串变小取决于其中间的子串,所以状态可以表达为 f[i][j]=f[i+1][j-1] ,当 s[i]<s[j] 时即使翻转也不能使字符串变小,所以可以不做考虑
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define N 5010ll ans;
int f[N][N];
string s;void solve(){cin>>s;for(int i=s.size()-1;i>=0;i--){for(int j=i;j<s.size();j++){if(s[i]==s[j])f[i][j]=f[i+1][j-1];if(s[i]>s[j])f[i][j]=true;if(f[i][j])ans++;}}cout<<ans<<endl;
}int main(){ios::sync_with_stdio(false);int t=1;// cin>>t;while(t--){solve();}return 0;
}