東東每個學期都會去寢室接受掃樓的任務,並清點每個寢室的人數。
每個寢室裡面有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 對於每一組資料,你需要輸出你找到的唯一的數。實現 ...