百練 2757 最長上公升子串行 線性dp

2021-06-23 04:48:08 字數 1173 閱讀 4189

考察點:用動態規劃的思想求解最長上公升子串行

思路:1,如果我們先找到前n個數的最長上公升子串行,然後再求n+1個數的上公升子串行,這個不應是子問題,因為他不符合無後效性,因為前n個數的序列,有可能有多種情況都符合最長上公升子串行的情況,這時候n+1個數出現時,我們就回對前面的多中情況產生影響;則不具有無後效性

2,真正的解題思路如下:

找子問題,我們定乙個上公升子串行最右邊的那個數為終點;則我們一一找到以1到n為終點的子串行,就可得解;

找狀態轉移,此時的狀態為數的位置n;

確定方程,len(k)=max(len(k),len(j))(j

提交情況:錯了兩次,都是沒考慮n==1的情況;

收穫:更進一步的了解了狀態的無後效性;

經驗:以後要考慮全面在提交,同時取最大的表示式max(lena[i],len[j]+1);

#include

#include

#include

#include

using namespace std;

int a[1500];

int lena[1500];

int n;

int main()

for(i=2;i<=n;i++)

printf("%d\n",max);

}return 0;

}也可以用貪心來做,

經驗:lower_bound()的熟練應運,括號裡面為(b,b+j,a[i]),返回的是指標;

#include

#include

#include

#include

using namespace std;

int a[1500];

int b[1500];

int n;

int main()

printf("%d\n",j);

}return 0;

}總結:動態規劃的三種形式

1,記憶遞迴性

優點:只經過有用的狀態,沒有浪費,遞推型會檢視一些沒用的狀態,有浪費;

缺點:可能會因為遞迴層數太深導致爆棧;函式呼叫帶來額外的時間開銷,無法使用滾動陣列,比遞推慢

2,我為人人遞推型

沒有明顯優勢,比較符合邏輯思維,個別時候,會比人人為我型節約空間

3,人人為我型遞推

選取好的演算法和資料結構,會降低時間複雜度

最長上公升子串行(百練2757)

總時間限制 2000ms 記憶體限制 65536kb 描述 乙個數的序列 bi,當 b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2 an 我們可以得到一些上公升的子串行 ai1,ai2 aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8...

百練 2757 最長上公升子串行

總時間限制 2000ms 記憶體限制 65536kb 描述乙個數的序列 bi,當 b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2 an 我們可以得到一些上公升的子串行 ai1,ai2 aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 ...

最長上公升子串行(百練2757)

總時間限制 2000ms 記憶體限制 65536kb 描述 乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有...