题目:找出下列最长的递增子串 str[n]={1,4,2,7,19}。(非连续,必须满足后面比前面的大)
小白版:what?
普通人版:n 长度的子串个数大概是2^n ,指数级别(不考虑)
二种方式:
一常见的DP,设置 a[n] 初始化为1(很重要),
套入以下核心代码
for(int i=1;i<n;i++){
for(int j=0;j<i;j++){ if(str[i]>str[j]&&a[i]<a[j]+1) a[i]=a[j]+1}}
中心思想:我既然比你爷爷大,那一定比你爸爸大。快叫太爷爷
二转化问题成匹配最长公共子串:
做之前二步准备。1。排序字符串形成 sort[]
2.二对数据 str[] ,和排序后的sort[],都可以建立一个二维数组 dp[n][n] 初始化0,
套入核心代码:答案就是dp[n][n]
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){ if(str[i]=sort[j]){dp[i][j]=a[i-1][j-1]+1 }else{ dp[i][j]=max(dp[i-1][j],dp[i][j-1])}} }
中心思想:同上快叫大爷爷