乙個數的子串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, 5, 9)等等。這些子串中最長的長度是3,比如子串行(3, 5, 9).你的任務,就是對於給定的序列,求出最長上公升子串的長度。
輸入格式:兩行,第1行1個整數n(n<=1000),表示序列長度,第2行n個整數用空格隔開表示具體數值。
輸出格式: 一行,乙個整數表示最長序列的長度。
7因為是最優子結構的問題,所以,可以採用動態規劃來做。1 7 3 5 9 4 8
定義dp[i]代表以第i個數結尾的最長上公升子串行的長度,所以最終的答案那就是整個dp陣列中最大的那乙個數。
下標原陣列
dp陣列11
1272
3314
5259
3641
782ans=max(dp)=3;
如果a[i](原陣列)>a[i-1],則dp[i]=dp[i-1]+1;因為第乙個一定是乙個上公升的子串,所以dp[1]=1。否則,dp[i]=1;
#include
#include
using
namespace std;
int n,a[
10010
],dp[
10010
],ans;
intmain()
乙個數的序列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)等等。這些子串行中最長的長度是4,比如子串行(1, 3, 5, 8).你的任務,就是對於給定的序列,求出最長上公升子串行的長度。
輸入格式:兩行,第1行1個整數n(n<=1000),表示序列長度,第2行n個整數用空格隔開表示具體數值。
輸出格式: 一行,乙個整數表示最長序列的長度
7和上一題一樣,也是最優子結構的問題,所以也採用動態規劃來做。1 7 3 5 9 4 8
令f[i]代表以i結尾的最長上公升子串行的長度。
下標原陣列
f陣列111
2723
3245
3594
6437
84ans=max(f)=4
①如果a[i](當前的數) > a[j](前乙個數),則f[i]=f[j]+1因為第乙個數肯定是乙個最長上公升子串行,所以dp[1]=1。②否則找到(從後往前)第乙個比a[i]小的數a[k],則f[i]=f[k]+1
#include
#include
using
namespace std;
int n,ans;
int a[
10010
],f[
10010];
intmain()
for(
int i=
1;i<=n;i++
) ans=
max(ans,f[i]);
printf
("%d"
,ans)
;return0;
}
最長上公升子串行(DP)
time limit 3000ms memory limit 65536k 有疑問?點這裡 乙個數的序列bi,當b 1 b 2 b s的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a 1,a 2,a n 我們可以得到一些上公升的子串行 a i1,a i2,a ik 這裡1 i 1 i 2 i...
最長上公升子串行(Dp)
lis問題是最經典的動態規劃基礎問題之一。如果要求乙個滿足一定條件的最長上公升子串行,你還能解決嗎?給出乙個長度為n整數序列,請求出它的包含第k個元素的最長上公升子串行。例如 對於長度為6的序列 2,7,3,4,8,5 它的最長上公升子串行為 2,3,4,5 但如果限制一定要包含第2個元素,那滿足此...
最長上公升子串行 dp
description 乙個數的序列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...