題目意思很簡單 就是讓你從n個數字中選取m個連續的數字使和最大 就是這樣沒錯 因為是環狀的 所以可以從末尾連到最開始
ps: 如果你覺得寫得一定沒有錯 但還是wa 你可能忽略了 long long 沒錯 恭喜你!!!(還要注意最後 mod n)
方法一 : 可以用字首和 遍歷一遍得到最大值和邊界問題
#include #include #include using namespace std;
const int maxn = 3000;
int main()
for (int i = n + 1; i <= n + m; i ++)
// for (int i = 1; i <= n + m - 1; i ++) cout << endl;
// for(int i = 1; i <= n + m - 1; i ++)
int head , tail;
long long ans = -999999;
for (int i = m; i <= n + m; i ++)
} if(head > n)head %= n;
if(tail > n)tail %= n;
cout << ans << " " << head << " " << tail << endl;
} }
方法二 是這樣的 可以用尺取法 維護兩個偽指標 和 中間變數來得到最大值 這樣的好處在於 如果陣列特別特別大 字首和無法儲存的時候 而且也比字首和的方法更快
#include using namespace std;
const int maxn = 3000;
int main()
for (int i = n + 1; i <= n + m - 1; i ++)
int head = 1, tail = m;
long long ans = -999999;
long long temp = 0;
for (int i = 1; i <= m; i ++)
temp += arr[i];
ans = temp;
int l = head;
int r = tail;
for (int i = 1; i < n; i ++)
} if(head > n)head %= n;
if(tail > n)tail %= n;
cout << ans << " " << head << " " << tail << endl;
}}
沒錯我把兩種方法對應反了 你以為我是不小心的?? 笑話 我怎麼可能沒發現 我就是故意的 就是這麼傲嬌
C語言(28)環之最大和
描述 int型範圍內,將m m 1000 個數圍成乙個圈,給定乙個數n n m 求連續的n個數使得和最大。輸出最大和及始末位置。輸入多組測試資料,每組資料首行是兩個數m,n,表示m個數,求n個連續最大和。輸出輸出三個數 sum,b,e,分別表示最大和,開始位置,結束位置。樣例輸入 5 3 4 2 3...
NYOJ 題目104最大和(動態規劃)
時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 給定乙個由整數組成二維矩陣 r c 現在需要找出它的乙個子矩陣,使得這個子矩陣內的所有元素之和最大,並把這個子矩陣稱為最大子矩陣。例子 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 其最大子矩陣為 9 2 4 ...
nyoj 104 最大和 區間dp
時間限制 1000 ms 記憶體限制 65535 kb 難度 5 描述 給定乙個由整數組成二維矩陣 r c 現在需要找出它的乙個子矩陣,使得這個子矩陣內的所有元素之和最大,並把這個子矩陣稱為最大子矩陣。例子 0 2 7 0 9 2 6 2 4 1 4 1 1 8 0 2 其最大子矩陣為 9 2 4 ...