jzoj6804-NOIP2020.9.26模拟jerry【dp】
生活随笔
收集整理的這篇文章主要介紹了
jzoj6804-NOIP2020.9.26模拟jerry【dp】
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
正題
題目大意
nnn個數n?1n-1n?1個+++或?-?號的一個算式,加上一些括號使得運算結果最大。
解題思路
對于+++號左右的兩個數字,無論如何加括號都不會變結果,所以我們可以合并這些數。然后就只剩下了減號,此時除了第一個就可以隨意選擇一段區間取反,那么對于嵌套了三層的括號,就可以拆成兩層也就是最多只能嵌套兩層括號。考慮dpdpdp,設fi,jf_{i,j}fi,j?表示到第iii個,嵌套了jjj層的括號的情況下最大的答案。
時間復雜度O(n)O(n)O(n)
codecodecode
#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=1e5+10; ll T,n,a[N],f[N][3],ans; inline ll read() {ll s=0,f=1; char c=getchar();while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar();}while(c>='0'&&c<='9') {s=s*10+c-'0';c=getchar();}return s*f; } int main() { // freopen("jerry.in","r",stdin); // freopen("jerry.out","w",stdout);scanf("%lld",&T);f[0][1]=f[0][2]=-1e18;while(T--){scanf("%lld",&n);for(int i=1;i<=n;i++)a[i]=read();ans=-1e18;for(ll i=1;i<=n;i++){if(a[i]<0){f[i][0]=-1e18;f[i][1]=max(f[i-1][1],max(f[i-1][0],f[i-1][2]))+a[i];f[i][2]=max(f[i-1][2],f[i-1][1])-a[i];}else{f[i][0]=max(f[i-1][0],max(f[i-1][1],f[i-1][2]))+a[i];f[i][1]=max(f[i-1][1]-a[i],f[i-1][2]-a[i]);f[i][2]=f[i-1][2]+a[i];}}printf("%lld\n",max(max(f[n][0],f[n][1]),f[n][2]));} }總結
以上是生活随笔為你收集整理的jzoj6804-NOIP2020.9.26模拟jerry【dp】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 电脑配置怎么检测好坏(电脑配置怎么检测)
- 下一篇: jzoj6805-NOIP2020.9.