WEEK12 作業 C 必做題3

2021-10-06 03:45:12 字數 1159 閱讀 7876

東東每個學期都會去寢室接受掃樓的任務,並清點每個寢室的人數。

每個寢室裡面有ai個人(1<=i<=n)。從第i到第j個宿舍一共有sum(i,j)=a[i]+…+a[j]個人

這讓宿管阿姨非常開心,並且讓東東掃樓m次,每一次數第i到第j個宿舍sum(i,j)

問題是要找到sum(i1, j1) + … + sum(im,jm)的最大值。且ix <= iy <=jx和ix <= jy <=jx的情況是不被允許的。也就是說m段都不能相交。

注:1 ≤ i ≤ n ≤ 1e6 , -32768 ≤ ai ≤ 32767 人數可以為負數。。。。(1<=n<=1000000)

輸入m,輸入n。後面跟著輸入n個ai 處理到 eof

輸出最大和。

131

2326

-14-

23-2

3

6

8

資料量很大,需要scanf讀入和dp處理。

區間動態規劃問題。

dp[i][j]:在前j個元素中選出不重合的i段的總和是多少(且第j個元素a[j]必須包含在其中)。

狀態轉移方程:dp[i][j]=max i-1<=k<=j-1將a[j]放在上一段末尾或將a[j]放在新的一段。

但是由於資料量很大,不可能同時儲存這麼多數,且我們注意到,dp[i-1][k]只在dp[i][j]的更新中用到,所以可以記錄下在a[1]-a[j]中選i-1(上一次迴圈)段的最大和結果數,在時間和空間上同時優化掉一維。令mx[j]為上乙個狀態的dp最大值,即在a[1]-a[j]中選i-1段的最大和。

優化後的狀態轉移方程:dp[j]=max(dp[j-1]+a[j],mx[j-1]+a[j])。

最後結果就是選i段的最大值ans。

#include #include #include #include using namespace std;

int a[1000100],dp[1000100],mx[1000100];

int main(int argc, char** ar**)

int ans;

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

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

} return 0;

}

Week12作業 必做題

a給出n個數,zjm想找出出現至少 n 1 2次的數,現在需要你幫忙找出這個數是多少?input 本題包含多組資料 每組資料報含兩行。第一行乙個數字n 1 n 999999 保證n為奇數。第二行為n個用空格隔開的整數。資料以eof結束。output 對於每一組資料,你需要輸出你找到的唯一的數。實現 ...

Week12作業 C 必做題 3 動態規劃

東東每個學期都會去寢室接受掃樓的任務,並清點每個寢室的人數。每個寢室裡面有ai個人 1 i n 從第i到第j個宿舍一共有sum i,j a i a j 個人 這讓宿管阿姨非常開心,並且讓東東掃樓m次,每一次數第i到第j個宿舍sum i,j 問題是要找到sum i1,j1 sum im,jm 的最大值...

Week12 必做題3(動態規劃)

東東每個學期都會去寢室接受掃樓的任務,並清點每個寢室的人數。每個寢室裡面有ai個人 1 i n 從第i到第j個宿舍一共有sum i,j a i a j 個人 這讓宿管阿姨非常開心,並且讓東東掃樓m次,每一次數第i到第j個宿舍sum i,j 問題是要找到sum i1,j1 sum im,jm 的最大值...