常見動態規劃模型 最大子段和 LIS LCS

2021-09-11 18:13:22 字數 3557 閱讀 7097

例1:下面數列的最大子段和是多少

-2,11,-4,13,-5,-2

概念:給定乙個由數字組成的序列,其中連續的一段子串行稱為乙個子段,子段中的所有數之和稱為子段和,這裡只考慮非空子段,即至少包含乙個元素的子段。

分析

實現

完整實現

#include

#include

using namespace std;

const

int inf =

0x7fffffff

;int num[10]

;int

main()

int ans =

-inf;

//先標記ans為num陣列中最大值

for(

int i =

0; i < n;

++i)

if(ans <=0)

else

else

ans =

max(ans, sum);}

} cout << ans << endl;

return0;

}

inp

ut

input

input:

6

-2 11 -4 13 -5 -2

out

pu

toutput

output

:

例2:在序列5,2,7,9,4,5,7,10中,最大上公升子串行的長度為

概念:在原序列取任意項,不改變他們在原來數列的先後次序,得到的序列稱為原序列的子串行。最長上公升子串行,就是給定序列中乙個最長的、數值從低到高排列的子排列,最長上公升子串行不一定是唯一的。例如:序列2,1,5,3,6,4,6,3的最長上公升子串行為1,3,4,6和2,3,4,6,長度均為4

分析

dp[i]

=max

(dp[i]

, dp[j]+1

),1<= j < i && a[j]

< a[i]

根據上述狀態轉移方程可以得到下表:i1

2345

678a[i

]a[i]

a[i]52

7945

710d p[

i]

dp[i]

dp[i]1

1232

345完整實現

#include

using namespace std;

int dp[

101]

, a[

101]

, n;

intlis()

} ans =

max(ans, dp[i]);

//ans記錄當前位置的最大上公升子串行

}return ans;

}int

main()

cout <<

lis(

)<< endl;

return0;

}

inp

ut

input

input:

8

5 2 7 9 4 5 7 10

out

pu

toutput

output

:

最長公共子串行:給定兩個序列s

1s_1

s1​和s

2s_2

s2​,求兩者的公共子串行s

3s_3

s3​的最長的長度

分析

lcs[i]

[j]= lcs[i -1]

[j -1]

+1

lcs[i]

[j]=

max(lcs[i]

[j -1]

, lcs[i -1]

[j])

轉移方程:lcs

[i][

j]=s

1[i]

≠s2[

j]

lcs[i][j] = \begin lcs[i - 1][j - 1] + 1& s_1[i] = s_2[j] \\ \max\ & s_1[i] \neq s_2[j] \end

lcs[i]

[j]=

​s1​

[i]=

s2​[

j]s1

​[i]

̸​=s

2​[j

]​

舉個例子,兩個序列s

1s_1

s1​ = abc

fb

cabcfbc

abcfbc

, s

2s_2

s2​ = abf

ca

babfcab

abfcab

,根據狀態轉移方程可得下表:

l cs

lcslc

s01(a aa)

2(b bb)

3(c cc)

4(f ff)

5(b bb)

6(c cc)

0000

0000

1(a aa)

0111

1112(bbb)

0122

2223(fff)

0122

3334(ccc)

0123

3345(aaa)

0123

3346(bbb)

0123

344完整實現:

#include

#include

#include

using namespace std;

int dp[

101]

[101];

intmain()

else}}

cout << dp[lena]

[lenb]

<< endl;

return0;

}

inp

ut

input

input:

abcdefgh

acjlfabhh

out

pu

toutput

output

:

動態規劃 最大子段和

給定乙個陣列a a0,a1,a2,an 求陣列中 連續子段之和 的最大值。1 最簡單的演算法 窮舉法 計算所有的連續子段之和,得出最大值 窮舉法 計算所有的子串行和 o n 3 public static int maxsum1 int data max tmp max tmp max return...

動態規劃 最大子段和

題目描述 給出一段序列,選出其中連續且非空的一段使得這段和最大。輸入輸出格式 輸入格式 第一行是乙個正整數nn,表示了序列的長度。第二行包含n個絕對值不大於10000的整數a i,描述了這段序列。輸出格式 乙個整數,為最大的子段和是多少。子段的最小長度為1。輸入輸出樣例 輸入樣例 1 72 4 3 ...

動態規劃 最大子段和

動態規劃 最大子段和 lyk喜歡幹一些有挑戰的事,比如說求區間最大子段和。它知道這個題目有o n 的做法。於是它想加強一下。也就是說,lyk一開始有n個數,第i個數字是ai,它找來了乙個新的數字p,並想將這n個數字中恰好乙個數字替換成p。要求替換後的最大子段和盡可能大。lyk知道這個題目仍然很簡單,...