• 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;
    }
    

      

  • 相关阅读:
    GIT操作远程仓库
    GIT基本使用方式
    Docker网络及私有仓库配置
    Docker容器资源控制
    Docker基本使用方法
    [linux Tcmd] sh source
    hh
    推演论
    智能小车项目计划
    [CATARC_2017S] Week2
  • 原文地址:https://www.cnblogs.com/zyf3855923/p/10754864.html
Copyright © 2020-2023  润新知