東東每個學期都會去寢室接受掃樓的任務,並清點每個寢室的人數。
每個寢室裡面有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 的最大值...