Week12 必做題3(動態規劃)

2021-10-05 22:02:02 字數 2049 閱讀 5266

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

每個寢室裡面有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

輸出最大和

131

2326

-14-

23-2

3

6

8

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

對於這個題,我們考慮用二維陣列dp[i][j]表示選了i

ii段,到第j

jj個為止,最大的結果,其中第j

jj個必選。對於第j

jj個數,我們有兩種處理方法:

選擇,與最後一段合併,dp[i][j]=dp[i][j-1]+a[j];

選擇,成為新的一段,dp[i][j]=dp[i-1][k]+a[j]; (i-1

然後三者取最大值即可,但是問題是這樣會mle,由於dp[i][j]都是從dp[i-1]或者dp[i]推過來的,我們將dp換成滾動陣列就行了。

while

(scanf

("%d %d"

,&m,

&n)==2)

int x=0;

long

long maxx=int_min/2;

for(

int j=

1; j<=n; j++

) x=

1-x;

for(

int i=

2; i<=m; i++

) maxx=

max(maxx,dp[x]

[j]);}

x=1-x;

}printf

("%lld\n"

,maxx)

;}

思路是好的,現實是慘的,t掉了。。。(說不定,不t也wa)

我們發現可以,k的那個迴圈可以由上一次迴圈j

jj的時候算出來,改進後,發現陣列第一維也可以去掉了。最終**見完整**。

//#pragma gcc optimize(2)

//#pragma g++ optimize(2)

//#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

const

int maxn=

1e6+10;

long

long m,n,dp[maxn]

,a[maxn]

,last[maxn]

;int

getint()

while

(ch>=

'0'&& ch<=

'9')

return x*s;

}int

main()

long

long maxx=int_min;

for(

int j=

1; j<=n; j++

)for

(int i=

2; i<=m; i++)}

printf

("%lld\n"

,maxx);}

return0;

}

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 動態規劃(三)B 必做題 2

zjm被困在乙個三維的空間中,現在要尋找最短路徑逃生!空間由立方體單位構成。zjm每次向上下前後左右移動乙個單位需要一分鐘,且zjm不能對角線移動。空間的四周封閉。zjm的目標是走到空間的出口。是否存在逃出生天的可能性?如果存在,則需要多少時間?input 輸入第一行是乙個數表示空間的數量。每個空間...

Week12作業 必做題

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