演算法學習之路|POJ-2479最大子串和(簡單dp)
題目大意:給一個數字串,求這個數字串中兩個不相交的子串和的最大值。
樣例:
1
10
1 -1 2 2 3 -3 4 -4 5 -5
結果:13
{1,,-1,2,2,3,-3,4}和{5}
或
{2,2,3,-3,4}和{5}
這是一個簡單dp問題,首先從前往後遍歷求出以第i個數字結尾的子串和的最大值dp1[i],再從後往前遍歷以第i個數字為開頭的子串和的最大值dp2[i],所求結果就是從2到n遍歷一遍i,dp1[i-1]+dp2[i]的最大值
程式碼:
#include <iostream>
#include <stdio.h>
#include <string.h>
#include<algorithm>
#define maxn 50005
#define inf 1000000007
using namespace std;
int dp[maxn];
int num[maxn];
int t,n;
void DP()
{
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)//正向求和
{
dp[i]=max(num[i],dp[i-1]+num[i]);
}
}
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
DP();
int ans=-inf,b=0,sum=-inf;
for(int i=n;i>1;i--)
{
b=max(num[i],b+num[i]);
if(b>sum)
sum=b;
if(sum+dp[i-1]>ans)
ans=sum+dp[i-1];
}
printf("%d
",ans);
}
return 0;
}
相關文章
- 演算法學習之路|最簡分數演算法
- 演算法學習之路|狀態壓縮dp演算法
- 線性dp:最長公共子串
- 最簡單的深度學習演算法——感知器的前世今生深度學習演算法
- 演算法學習之簡單排序演算法排序
- 從最簡單的入手學習 Docker (一)Docker
- 學習Linux tar 命令:最簡單也最困難Linux
- Python學習之路1-變數和簡單資料型別Python變數資料型別
- 演算法學習之路|划拳演算法
- 分治法演算法學習(一)——歸併排序、求最大子陣列和演算法排序陣列
- 【DP】乘積最大子陣列陣列
- 演算法學習之路|四平方和演算法
- [學習筆記] 單調佇列最佳化DP - DP筆記佇列
- 演算法學習之路|有向無環圖(DAG)求最長路演算法
- 演算法學習之路|A除以B演算法
- 演算法學習之路|列印排名演算法
- 演算法學習之路|方格分割演算法
- 演算法學習之路|朋友數演算法
- 演算法學習之路|SpellItRight演算法
- 演算法學習之路|歐幾里得遊戲演算法遊戲
- 演算法學習之路|月餅演算法
- 演算法學習之路|PATRanking演算法
- 演算法學習之路|列印沙漏演算法
- 演算法學習之路|快速排序演算法排序
- 演算法學習之路|結繩演算法
- 演算法學習之路|數零壹演算法
- 演算法學習---歸併演算法簡單記錄演算法
- [-演算法篇-] 最大子序列和演算法
- 演算法學習之路|開學寄語演算法
- 最大子陣——動態規劃DP動態規劃
- 爬蟲-BeautifulSoup簡單分析和學習爬蟲
- 【演算法學習筆記】概率與期望DP演算法筆記
- 動態規劃演算法(DP)學習<1>動態規劃演算法
- 串的簡單處理
- 簡單演算法――Cisco某個學習資料演算法
- 演算法學習之路|說反話演算法
- 演算法學習之路|幼兒園買玩具演算法
- 演算法學習之路|小賭怡情演算法