日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

简单DP【p2642】双子序列最大和

發(fā)布時間:2023/11/27 生活经验 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 简单DP【p2642】双子序列最大和 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

Description

給定一個長度為n的整數(shù)序列,要求從中選出兩個連續(xù)子序列,使得這兩個連續(xù)子序列的序列和之和最大,最終只需輸出最大和。一個連續(xù)子序列的和為該子序列中所有數(shù)之和。每個連續(xù)子序列的最小長度為1,并且兩個連續(xù)子序列之間至少間隔一個數(shù)。

Input

第一行是一個整數(shù)表示n。

第二行是n個整數(shù)表示整數(shù)序列。

Output

一個數(shù),兩個連續(xù)子序列的序列和之和。

動態(tài)規(guī)劃.這不某年初賽題

我們設(shè)\(l[i]\)代表從\(1\)\(i\)的最大的子序列的和,\(r[i]\)代表從\(i\)\(n\)的最大的子序列的和.(可以不包含\(i\)

然后維護的話,每次轉(zhuǎn)移取\(max\)
\[ l[i]=max(l[i-1]+x[i],x[i])\\ r[i]=max(r[i+1]+x[i],x[i]) \]
然后取前綴\(max\)和后綴\(max\).

\(ans\)的時候就是
\[ ans=max(ans,l[i-1]+r[i+1]) \]
(因為題目要求至少間隔一個數(shù)~w~

還有,由于可能出負數(shù),所以\(l\)數(shù)組要從\(2\)開始.\(r\)數(shù)組要從\(n-1\)開始

代碼

#include<cstdio>
#include<cctype>
#include<iostream>
#define R register
using namespace std;
inline void in(int &x)
{int f=1;x=0;char s=getchar();while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}while(isdigit(s)){x=x*10+s-'0';s=getchar();}x*=f;
}
int n,ans=-2147483644;
int l[1000008],r[1000008],x[1000008];
int main()
{in(n);for(R int i=1;i<=n;i++)in(x[i]);l[1]=x[1];for(R int i=2;i<=n;i++)l[i]=max(l[i-1]+x[i],x[i]);for(R int i=2;i<=n;i++)l[i]=max(l[i-1],l[i]);r[n]=x[n];for(R int i=n-1;i>=1;i--)r[i]=max(r[i+1]+x[i],x[i]);for(R int i=n-1;i>=1;i--)r[i]=max(r[i+1],r[i]);for(R int i=2;i<n;i++)ans=max(ans,r[i+1]+l[i-1]);printf("%d",ans);
}

轉(zhuǎn)載于:https://www.cnblogs.com/-guz/p/9843807.html

總結(jié)

以上是生活随笔為你收集整理的简单DP【p2642】双子序列最大和的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。