zoukankan      html  css  js  c++  java
  • CodeForces

    题目链接

    题目大意

      给一列数,你可以选择一段连续区间(可以为空)将其乘上x,求最大子段和。

    解题思路

      子段和最大的区间一共有三种情况,要么全是没乘x的,要么全是乘上x的,要么是中间有一段是乘上x两端没乘(两端也可以没有),开个二维数组表示三种状态即可。

    代码

    const int maxn = 3e5+10;
    const int maxm = 2e3+10;
    int n; 
    ll arr[maxn], dp[maxn][3], x;
    int main() {
    	cin >> n >> x;
    	for (int i = 1; i<=n; ++i) cin >> arr[i];
    	ll ans = 0;
    	for (int i = 1; i<=n; ++i) {
    		dp[i][0] = max(dp[i-1][0]+arr[i], arr[i]);
    		dp[i][1] = max({dp[i-1][0]+arr[i]*x, dp[i-1][1]+arr[i]*x, arr[i]*x});
    		dp[i][2] = max({dp[i-1][2]+arr[i], dp[i-1][1]+arr[i], arr[i]});
    		ans = max({ans, dp[i][0], dp[i][1], dp[i][2]});
    	}
    	cout << ans << endl;
    	return 0;	
    }
    
  • 相关阅读:
    java中的设计模式
    stack
    最大堆排序
    Starship Troopers
    Tick and Tick
    Last non-zero Digit in N!
    G
    C
    B
    A
  • 原文地址:https://www.cnblogs.com/shuitiangong/p/14409946.html
Copyright © 2011-2022 走看看