思路
动态规划:
1. 定义dp[],dp[i]为以i结尾的上升序列总数
2. dp初始化1,因为单个都算一个序列。
3. 遍历字符串str,j(0>=j<i),若str[j]<str[i],则dp[i]++;若str[j]==str[i],dp[i]-=dp[j],因为0-j的上升序列重复。
4. 最后计算dp累加和,用Arrays一行代码即可。
代码
import java.util.Arrays;
public class 本质上升序列 {
public static void main(String[] args) {
String str="tocyjkdzcieoiodfpbgcncsrjbhmugdnojjddhllnofawllbhf" +
"iadgdcdjstemphmnjihecoapdjjrprrqnhgccevdarufmliqij" +
"gihhfgdcmxvicfauachlifhafpdccfseflcdgjncadfclvfmad" +
"vrnaaahahndsikzssoywakgnfjjaihtniptwoulxbaeqkqhfwl";
int len=str.length();
int dp[]=new int[len];
Arrays.fill(dp, 1);
for (int i = 1; i < len; i++) {
for (int j = 0; j < i; j++) {
if(str.charAt(i)>str.charAt(j)) {
dp[i]+=dp[j];
}else if(str.charAt(i)==str.charAt(j)) {
dp[i]-=dp[j];
}
}
}
System.out.println(Arrays.stream(dp).sum());
}
}