數學考試dp

2021-10-06 16:07:19 字數 820 閱讀 1887

來自

先是read()函式,用於快速讀入,比cin快,比printf快

int

read()

ch=getchar()

;}while

(ch>=

'0'&&ch<=

'9')

return x*f;

}

呼叫函式的時候定義乙個新變數

比如輸入乙個t,表示測試次數

int t;

t=read()

;

接下來是看題幹,兩個不連續的區間

區間長度為k

int

main()

for(

int i=n-k+

1;i>k;i--

) cout<}return0;

}

用乙個sum[i]表示前i個數的和,這樣區間[l,r]可以用sum[r-1]-sum[l-1]表示。

這種開陣列的做法避免了遍歷ai求和的過程(優化)。

然後自右向左,比較[i,k]的區間中的成績和,取最大的存入ans[i]中,定義乙個res為最後結果,取i左邊最大的區間和右邊最大的區間和。

右邊最大的區間為ans[i] (sum[i+k-1] - sum[i-1]) ,左面最大的為sum[i-1] - sum[i-k-1].

再解釋一下,就是ans[i]的部分在通過遍歷尋找右面區間的最大值,然後如果有更大的就頂替掉原來的ans[i],不然就ans[i]=ans[i+1]繼續保持最大結果。i左邊的區間同理。最後用res存和最大的情況,輸出。

數學考試(差分)

今天qwb要參加乙個數學考試,這套試卷一共有n道題,每道題qwb能獲得的分數為ai,qwb並不打算把這些題全做完,他想選總共2k道題來做,並且期望他能獲得的分數盡可能的大,他準備選2個不連續的長度為k的區間,即 l,l 1,l 2,l k 1 r,r 1,r 2,r k 1 r l k input ...

數學考試(字首和)

今天qwb要參加乙個數學考試,這套試卷一共有n道題,每道題qwb能獲得的分數為ai,qwb並不打算把這些題全做完,他想選總共2k道題來做,並且期望他能獲得的分數盡可能的大,他準備選2個不連續的長度為k的區間,即 l,l 1,l 2,l k 1 r,r 1,r 2,r k 1 r l k 第一行乙個整...

數學考試 (字首和 思維)

題目 找出數列中不連續的最大的k區間 和第二大的k區間 這樣的貪心思想是錯誤的。例如7 3 5 6 6 8 10 12 7 不連續的第一大3區間 和第二大分別為 8 10 12 和 5 6 6 這樣計算答案為47.實際上應該選 6 6 8 和 10 12 7 答案為49 以i為分界線,i的左邊包括i...