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

      

  • 相关阅读:
    python进程同步,condition例子
    python管道pipe,两个进程,使用管道的两端分别执行写文件动作,带锁(lock)
    无论怎样,拒绝了
    这两天发现又到了写无可写的地步
    用Perl编写Apache模块
    技术开发团队的项目管理工具
    *nix下传统编程入门之GCC
    当kfreebsd 用户遇见openSUSE系统
    kFreeBsd 国内开源镜像站汇总
    [转]编程语言与宗教
  • 原文地址:https://www.cnblogs.com/zyf3855923/p/10754864.html
Copyright © 2011-2022 走看看