例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:
6out-2 11 -4 13 -5 -2
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:
8out5 2 7 9 4 5 7 10
pu
toutput
output
:
最長公共子串行:給定兩個序列s1s_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舉個例子,兩個序列s[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
]
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:
abcdefghoutacjlfabhh
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知道這個題目仍然很簡單,...