1.動態規劃
此題和上一題的解法基本一樣
設dp(len),dp[i]表示以nums[i]結尾的最長子序列的長度
設count(len),count[i]表示以nums[i]結尾的長度為dp[i]的序列個數
對於dp[i]的求法,仍然是dp[i],dp[j]+1中的最大值,不過在這裡需要區分情況
對於i>j,當nums[i]>nums[j](j從0---i-1),表示可以將nums[i]新增在nums[j]後面,此時分為兩種情況:
1)dp[j]+1>dp[i],說明第乙個找到長度為dp[j]+1且以nums[i]結尾的遞增子串行,則dp[i]=dp[j]+1.count[i]=count[j](以nums[i]結尾的遞增子串行個數等於以nums[j]結尾的遞增子串行的個數)
2)dp[j]+1=dp[i],說明不是長度為dp[j]+1(或dp[i])且以nums[i]結尾的遞增子串行不是第一次找到,
原有的長度為dp[i]以nums[i]結尾的序列數是count[i],
新找到的長度為dp[i]且以nums[i]結尾的序列個數為count[j],
則總的長度為dp[i]以nums[i]結尾的序列數是count[i]+count[j],即count[i]=count[i]+count[j]
遍歷過程中,記錄最長子序列的長度,記為imax
然後遍歷dp,記錄與imax相等的dp[i]對應的count[i]
**如下:
class solution
else if(dp[j]+1==dp[i])
}imax=max(imax,dp[i]);//記錄最長子序列的長度
}int ans=0;
for(int i=0;i
if(dp[i]==imax)
ans+=count[i];
return ans;}};
Leetcode最長上公升子串行LIS
理論 動態規劃初步 最長上公升子串行 lis 模板 void slove int first lower bound dp,dp n,inf dp printf d n dp first 1 printf d n first 題解 相當於求最長公共子串行,但是普通的演算法需要o n m 這道題目ta...
最長上公升子串行
問題描述 乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等...
最長上公升子串行
最長上公升子串行問題是各類資訊學競賽中的常見題型,也常常用來做介紹動態規劃演算法的引例,筆者接下來將會對poj上出現過的這類題目做乙個總結,並介紹解決lis問題的兩個常用 演算法 n 2 和 nlogn 問題描述 給出乙個序列a1,a2,a3,a4,a5,a6,a7.an,求它的乙個子串行 設為s1...