tyvj 1305 最大子序和 dp 單調佇列

2021-08-28 17:16:06 字數 967 閱讀 5906

時間限制

記憶體限制

評測方式

題目**

1000ms

131072kib

標準比較器

local

輸入乙個長度為n的整數序列,從中找出一段不超過m的連續子串行,使得整個序列的和最大。

例如 1,-3,5,1,-2,3

當m=4時,s=5+1-2+3=7

當m=2或m=3時,s=5+1=6

第一行兩個數n,m

第二行有n個數,要求在n個數找到最大子序和

乙個數,數出他們的最大子序和

資料範圍:

100%滿足n,m<=300000

輸入樣例 #1

輸出樣例 #1

6 4

1 -3 5 1 -2 3

7

題目分析:設dp[i]表示到第i個數,不超過m的最大連續子段和,sum[i]表示1~i的字首和

則容易得到dp[i]=max(sum[i]-sum[k]) (i-m<=k<=i),形如此類的遞推式可由單調佇列維護

#include #include #include #define ll long long

using namespace std;

int const max = 300005;

ll sum[max], x;

dequedq;

int main()

long long ans = sum[1];

for (int i = 1; i <= n; i++)

dq.push_back(i);

while (!dq.empty() && i - m > dq.front())

ans = max(ans, sum[i] - sum[dq.front()]);

}printf("%lld\n", ans);

}

TYVJ 1305 最大子序和 烽火傳遞

描述 輸入乙個長度為n的整數序列,從中找出一段不超過m的連續子串行,使得整個序列的和最大。例如 1,3,5,1,2,3 當m 4時,s 5 1 2 3 7 當m 2或m 3時,s 5 1 6 第一行兩個數n,m 第二行有n個數,要求在n個數找到最大子序和 乙個數,數出他們的最大子序和 6 4 1 3...

tyvj1305 最大子序和(單調佇列

時間限制 記憶體限制 評測方式 題目 1000ms 131072kib 標準比較器 local 輸入乙個長度為n的整數序列,從中找出一段不超過m的連續子串行,使得整個序列的和最大。例如 1,3,5,1,2,3 當m 4時,s 5 1 2 3 7 當m 2或m 3時,s 5 1 6 第一行兩個數n,m...

Tyvj1305最大子序和(單調佇列優化dp)

輸入乙個長度為n的整數序列,從中找出一段不超過m的連續子串行,使得整個序列的和最大。例如 1,3,5,1,2,3 當m 4時,s 5 1 2 3 7 當m 2或m 3時,s 5 1 6 第一行兩個數n,m 第二行有n個數,要求在n個數找到最大子序和 乙個數,數出他們的最大子序和 6 4 1 3 5 ...