最大子段和與最大子陣和 動態規劃解法

2021-08-20 13:20:12 字數 976 閱讀 8502

在乙個陣列中找出和最大的連續幾個數。(至少包含乙個數)

例如:陣列a = [−2, 1, −3, 4, −1, 2, 1, −5, 4],則連續的子串行[4,−1,2,1]有最大的和6.

輸入格式

第一行輸入乙個不超過1000的整數n。

第二行輸入n個整數a[i]。

輸出格式

第一行輸出乙個整數,表示最大的和。

#include#includeusing namespace std;

int dp[1010]; //dp[j]表示子串的和,如果d[j-1]>0那麼的d[j]=d[j-1]+a[j],否則的d[j]=a[j]

//因為一旦d[j-1]<0,後面的數+d[j-1]肯定《後面的數 所以dp[j]=a[j]斷開以前子串和

int ans;

int main()

cin>>n;

for(int i=0;i>a[i];

} ans=dp[0]=a[0]; //初始化 ans=dp[0]=1;

for(int j=1;j0; dp[1]=1+2=3;

else

ans=max(dp[j],ans); //不斷尋找dp中的最大值

} cout<

#include#include#includeusing namespace std;

//注意:在理解最大子段和的基礎上再研究這個

//因為題目中說明連續,所以行和列是連續的,

int main()

,dp[51]; //a[51][51]表示矩陣,b[51]表示子矩陣的和 ,詳見下面詳細例子

int ans=-999;

cin>>n>>m;

for(int i=0;i>a[i][j];

} }for(int st=0;st0)

else

ans=max(ans,dp[k]);

}} }

cout<

最大子陣和(動態規劃)

題目描述 有乙個包含正數和負數的二維陣列。乙個子矩陣是指在該二維陣列裡,任意相鄰的下標是1 1或更大的子陣列。乙個子矩陣的和是指該子矩陣中所有元素的和。本題中,把具有最大和的子矩陣稱為最大子矩陣。例如 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 這個陣列的最大子矩陣為 9 2 4...

最大子段(陣)和

這是一道dp經典題 感覺什麼都經典 也是很常見的乙個題型,具體思路就是用sum記錄乙個字首和,從a 1 遍歷到a n 每次,加上去,但是一旦sum成了負數,就沒必要字首和了,重新賦值0 因為前面就是累贅了 然後,就做出來了.1 include2 using namespace std 3int n,...

動態規劃 最大子段和

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