動態規劃 最大上公升子串行(hdu1087)

2021-07-24 18:23:32 字數 828 閱讀 7830

題目描述:

求乙個序列中 不一定連續(可以跳躍)但是數值遞增的最大和子串行

解題思路:

這道題和之前的子串行題不一樣,因為無法判斷當前節點的取捨情況,即1,2,10序列,這個10我未必會選,因為10後面可能是7,8,9

看起來總覺得和揹包問題有什麼聯絡,其實的確差不多。

我們先假設 乙個點i,以及某個子最優解點j

一、點j的值是否小於點i,如果小於,則符合條件   即:a[j]二、如果可以進行跳躍,那麼有兩種可能,①這個總和d[j]可能為負,那麼我還不如不加,也就是直接從點i開始

②總和d[j]為正,那麼加上a[i]的值,就變成了到達i點時最大的值

即:我們不去考慮具體序列是怎樣跳躍的,因為之前的子最優解已經記錄了到達某乙個點時其最大的權值了。

我們只需要考慮,當到達i點時,我們選取哪個最優解j點最為i的前乙個點即可~

想到這裡,**基本上就能夠實現了,我們發現跳躍的行為又很像數塔的邏輯

因為這些問題都屬於dp問題,唯一的區別就是狀態轉移方程的不同,本題的轉台轉移方程即d[i]=fmax(d[i],d[j]+a[i])

#includelong a[1001];

long d[1001];

int fmax(int a,int b)

int main()

{ int n;

while(scanf("%d",&n)&&n)

{for(int i=1;i<=n;i++) scanf("%d",&a[i]),d[i]=a[i];

int ans=0;

for(int i=1;i<=n;i++)

{for(int j=1;j

動態規劃 最大上公升子串行

乙個數的序列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 等等。這些子串...

動態規劃 求最大上公升子串行

問題描述 乙個數的序列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 等等...

最大上公升子串行(動態規劃)

最大上公升子串行 動態規劃 s 給定陣列,輸出陣列的最大上公升子串行。輸入 兩行測試資料 第一行代表陣列元素個數 第二行輸入陣列中的整數 輸出 輸出最大上公升子串行的長度 輸入樣例 81 3 4 2 7 9 6 8 輸出樣例 5 一和 二思路一樣,都是從陣列的第i 1 i n 位置開始尋找最大上公升...