動態規劃:最大子串和

 

 


題目連接(點擊直達)


 

問題 B: X額寶

時間限制: 1 Sec  內存限制: 256 MB
提交: 46  解決: 33
[狀態] [提交] [命題人:外部導入]

題目描述

【理財有風險,投資需謹慎】
Alice計劃將本身的全部紅包拿去投資。
在粗略預測了該理財產品的各日收益後,Alice但願經過一次買賣得到最大的收益。
買賣當天都可以享受到當日盈虧,容許一天內先買後賣。
但願你幫她計算一下最大盈利。

輸入

第一行是樣例個數K(1<=K<=100)
每一個樣例的第一行是天數N(1<=N<=100)
第二行包含N個整數Ai(-100<=Ai<=100),表示當天盈虧。

輸出

對於每一個樣例,輸出一個數字表示Alice的最大盈利。
若是該理財產品賺不到錢,她也能夠選擇不購入此產品,請直接輸出0。

樣例輸入

 

4
3
1 0 0
9
-2 1 -3 4 -1 2 1 -5 4
6
-4 -1 5 -4 1 -1
3
-9 -9 -6

 

樣例輸入

1
6
5
0

 


原理:先定義一個dp的數組變量,以n爲長度,從dp[1]開始進行一次for循環(ps:若是從0開始會致使數組越界),利用max函數判斷是當前的a[i]大仍是上一個dp加上當前的a[i]之和大,即max(a[i],dp[i-1]+a[i]);找出二者中較大的一個,做爲當前dp[i]中的內容。
以後再作一次i從0到9的for循環,找出最終最大的一個和。
僞代碼:
for(i=1;i<n;i++)
{
dp[i]=max(a[i]+dp[i-1]+a[i]);
}
int m=dp[0];
for(i=0;i<n;i++)
{
m=max(m,dp[i]);
}



C++代碼
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int main()
 4 {
 5     int k,i,n,j;
 6     scanf("%d",&k);
 7     for(i=0;i<k;i++)
 8     {
 9         scanf("%d",&n);
10         int a[n]={0},dp[n]={0};
11         for(j=0;j<n;j++)
12         {
13             scanf("%d",&a[j]);
14         }
15         int l;
16         dp[0]=a[0];
17         for(l=1;l<n;l++)
18         {
19             dp[l]=max(a[l],dp[l-1]+a[l]);
20         }
21         int m=dp[0];
22         for(j=0;j<n;j++)
23         {
24             m=max(m,dp[j]);
25         }
26         if(m>0)
27         printf("%d\n",m);
28         else
29         {
30             printf("0\n");
31         }
32     }
33 }
相關文章
相關標籤/搜索