DP入門 動態規劃初步 幾類子串行問題

2021-08-05 19:27:06 字數 1815 閱讀 5267

動態規劃初步—子串行問題,本文包括:最大連續子串行和,最大(長)上公升子串行,最大(長)公共子串行

找出一維陣列中最大的連續子串行,狀態轉移方程如下: su

m=ma

x(a[

i]+s

um,a

[i])

; 例題:hdu 1003-max sum(最大連續子串行和)

注:此題由於要輸出和最大序列的起始位置和終止位置,形式與上列公式有所出入。但思想一致。

**示例

#include

#include

using

namespace

std;

#define max 100005

int ar[max];

int start[max],sum[max];

int fun(int ar,int n)

else

if(sum[i]>sum[end]) end=i;

}return end;

}int main()

找出陣列中最長的嚴格公升序序列(可以不連續),狀態轉移方程如下: dp

[i]=

max(

dp[i

],dp

[j]+

1)⋅⋅

⋅ar[

j][i];

例題:poj 2533-longest ordered subsequence(最大上公升子串行)

**示例:

#include

#include

using

namespace

std;

int ar[1005],dp[1005];

int lis(int ar,int n) //最長上公升子串行長

return ans;

}int main()

兩個字串中最長的公共子串行(可以不連續),狀態轉移方程如下: dp

[i][

j]=d

p[i−

1][j

−1]+

1⋅⋅⋅

⋅⋅⋅⋅

⋅⋅⋅⋅

⋅s1[

i−1]

==s2[

j−1]

; dp

[i][

j]=m

ax(d

p[i−

1][j

],dp

[i][

j−1]

)⋅⋅⋅

s1[i

−1]!

=s2[

j−1]

例題:poj 1458-common subsequence(最大公共子串行)

**示例

#include

#include

using

namespace

std;

#define max 1001

int dp[max][max];

int lcs(char s1,char s2) //最長公共子串行長

}return dp[len1][len2];

} int main()

最大連續子串行 DP動態規劃

時間限制 1 sec 記憶體限制 128 mb 提交 44 解決 20 提交 狀態 討論版 給定 k 個整數的序列 其任意連續子串行可表示為 其中1 i j k。最大連續子串行是所有連續子串行中元素和最大的乙個,例如給定序列 其最大連續子串行為 最大和為20。編寫程式得到其中最大子串行的和並輸出該子...

最大連續子串行 DP動態規劃

時間限制 1 sec 記憶體限制 128 mb 提交 44 解決 20 提交 狀態 討論版 給定 k 個整數的序列 其任意連續子串行可表示為 其中1 i j k。最大連續子串行是所有連續子串行中元素和最大的乙個,例如給定序列 其最大連續子串行為 最大和為20。編寫程式得到其中最大子串行的和並輸出該子...

最大連續子串行 DP動態規劃

時間限制 1 sec 記憶體限制 128 mb 提交 44 解決 20 提交 狀態 討論版 給定 k 個整數的序列 其任意連續子串行可表示為 其中1 i j k。最大連續子串行是所有連續子串行中元素和最大的乙個,例如給定序列 其最大連續子串行為 最大和為20。編寫程式得到其中最大子串行的和並輸出該子...