方法一:
暴力枚举区间,转成biginteger检查大小
import java.io.*;
import java.math.BigInteger;
import java.util.*;
public class Main {
static Scanner cin = new Scanner(System.in);
public static void main(String[] args) {
StringBuilder s = new StringBuilder(cin.next());
int ans=0;
for (int i = 0; i < s.length(); i++) {
for (int j = i + 1; j <= s.length(); j++) {
if (check(s.substring(i, j)))
ans++;
}
}
System.out.println(ans);
}
private static boolean check(String s) {
String rs=(new StringBuilder(s).reverse()).toString();
return new BigInteger(rs).compareTo(new BigInteger(s))==-1;
}
}
复杂度太高了,只能过20%的数据。
方法二:
思考:一个区间什么时候能满足翻转后变小?肯定是最右边的数需要比最左边小,翻转后整体必变小。
如果最右边的数和最左边的一样大呢?那我们可以检查下标最右边-1和下标最左+1的数的大小,同上
区间能否成立可以用二维boolean判断
import java.io.*;
import java.math.BigInteger;
import java.util.*;
public class Main {
static Scanner cin = new Scanner(System.in);
public static void main(String[] args) {
char[] s= cin.next().toCharArray();
int n=s.length;
int ans=0;
boolean[][]dp=new boolean[n+10][n+10];
for (int i=1;i<n;i++){
for (int j=i-1;j>=0;j--){
if(s[i]<s[j]){
dp[j][i]=true;
ans++;
}
else if(s[i]==s[j]&&dp[j+1][i-1]){
dp[j][i]=true;
ans++;
}
}
}
System.out.println(ans);
}
}
写后感:网上看到别人发的题,写完暴力看了一会没啥思路,看了眼标签区间dp才写出来,也不知道自己考试能不能写出来。而且没想到暴力只过了20,如果是之前考试时我肯定毫不犹豫写暴力版,因为不确定自己是不是能快速写出正解,但是这个得分,我得重新考虑了。