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 ...