zoukankan      html  css  js  c++  java
  • D. Beautiful Array

    time limit per test
    2 seconds
    memory limit per test
    256 megabytes
    input
    standard input
    output
    standard output

    You are given an array aa consisting of nn integers. Beauty of array is the maximum sum of some consecutive subarray of this array (this subarray may be empty). For example, the beauty of the array [10, -5, 10, -4, 1] is 15, and the beauty of the array [-3, -5, -1] is 0.

    You may choose at most one consecutive subarray of aa and multiply all values contained in this subarray by xx. You want to maximize the beauty of array after applying at most one such operation.

    Input

    The first line contains two integers nn and xx (1n3105,100x1001≤n≤3⋅105,−100≤x≤100) — the length of array aa and the integer xx respectively.

    The second line contains nn integers a1,a2,,ana1,a2,…,an (109ai109−109≤ai≤109) — the array aa.

    Output

    Print one integer — the maximum possible beauty of array aa after multiplying all values belonging to some consecutive subarray xx.

    Examples
    input
    Copy
    5 -2
    -3 8 -2 1 -6
    
    output
    Copy
    22
    
    input
    Copy
    12 -3
    1 3 3 7 1 3 3 7 1 3 3 7
    
    output
    Copy
    42
    
    input
    Copy
    5 10
    -1 -2 -3 -4 -5
    
    output
    Copy
    0
    
    Note

    In the first test case we need to multiply the subarray [-2, 1, -6], and the array becomes [-3, 8, 4, -2, 12] with beauty 22 ([-3, 8, 4, -2, 12]).

    In the second test case we don't need to multiply any subarray at all.

    In the third test case no matter which subarray we multiply, the beauty of array will be equal to 0.

    把整个序列分成三段来dp。

    dp[0]表示没有乘过x序列的最大值。

    dp[1]表示正在乘x的序列的最大值。

    dp[2]表示已经乘完x的序列的最大值。

    则dp[0]=max(dp[0],dp[0]+val);

    dp[1]=max(dp[0],dp[1]+x*val);

    dp[2]=max(dp[1],dp[2]+val);

    比赛的时候真的想不到dp。。还是自己太菜了。

    #include <bits/stdc++.h>
    #define maxn 300005
    using namespace std;
    typedef long long ll;
    ll dp[3];
    int main()
    {
        int n;
        ll m,res=-1e18;
        scanf("%d%lld",&n,&m);
        for(int i=1;i<=n;++i)
        {
            ll x;
            scanf("%lld",&x);
            dp[0]=max(0ll,dp[0]+x);
            dp[1]=max(dp[0],dp[1]+x*m);
            dp[2]=max(dp[1],dp[2]+x);
            res=max(res,dp[2]);
        }
        cout<<res<<endl;
        return 0;
    }
    

      

  • 相关阅读:
    应对高并发场景的redis加锁技巧
    Spring中@Transactional事务回滚(含实例具体解说,附源代码)
    计算机网络10--计算机网络体系结构简单介绍
    IIS身份验证的配置
    AMR音频文件格式分析
    IOS版本号被拒的经历
    两分钟读懂《成大事者不纠结》——读书笔记
    同一个TextView设置不同的颜色和大小
    似非而是的程序猿悖论---为什么救火比防火更加吃香?
    OS
  • 原文地址:https://www.cnblogs.com/zyf3855923/p/10754864.html
Copyright © 2011-2022 走看看