帶權的最大子段和問題

2021-10-07 19:19:22 字數 1077 閱讀 8276

description

在短學期和演算法導論課期間,我們一共討論了四種求解最大子段和問題的方法,上一屆的期末考試也考了交替出現的子段和問題,今天我們再拓展一下,研究一下最大的帶權子段和問題,這個問題我們已經找到了很有意思的應用背景。例如已知三個權係數分別為1、-2、1,考慮從i開始的序列,帶權的累加和是:a[i]-2a[i+1]+a[i+2]+a[i+3]-2a[i+4]+a[i+5]+…,你的任務是程式設計序計算最大的帶權子段和。

input

本問題有多組測試資料,對於每組測試資料,輸入有三行,第一行是兩個用空格隔開的n和m,其中1<=m<=100,m<=n<=100000;第二行是用空格隔開的m個整數,表示帶權的係數;第三行是n個用空格隔開的整數,表示乙個有n個元素的序列。輸入保證中間運算過程不會超過int範圍。

output

對於每組測試資料,輸出只有一行,即最大的子段和的值。

sample input

1031

-2110

-911-

2-312

87-10

6

sample output

63
**

#include

using

namespace std;

typedef

long

long ll;

const

int maxn=

100010

;ll dp[maxn]

[110];

ll a[maxn]

,b[maxn]

;int

main()

else

dp[i]

[j]=dp[i-1]

[j-1

]+a[i]

*b[j]

; ans=

max(ans,dp[i]

[j]);}

}printf

("%lld\n"

,ans);}

return0;

}

最大子段和問題

給定n個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如a i a i 1 a j 的子段和的最大值。當所給的整均為負數時定義子段和為0 分治法 分析 首先將陣列分為兩部分,最大子段和 可以在陣列的左半部分也可以在右半部分,也可以橫跨分割點,因此我們只需要用分治思想求出左邊最大...

最大子段和問題

給定n 個整數 有可能是負數 組成的序列,要求分別用蠻力法,減治法和動態規劃法,求最該序列的最大子段和,並對它們的效率進行比較分析。也稱窮舉法或列舉法,是一種簡單直接地解決問題的方法,常常基於問題的描述,所以,蠻力法也是最容易應用的方法。它依賴的基本技術是遍歷,採用一定的策略依次處理待求解問題的所有...

最大子段和問題

問題描述 給定n個整數 可能為負數 組成的序列a 1 a 2 a 3 a n 求該序列如 a i a i 1 a j 當所給的整數均為負數時定義子段和為0.如果序列中全部是負數則 最大子段和為0,依次所定義 所求的最優值max,1 i問題解析 動態規劃演算法 dp i 包含元素i的子段和 dp 0 ...