http://codeforces.com/problemset/problem/1155/D
基础的线性dp
先导知识点:最大子段和 dp[i] = max(dp[i - 1] + arr[i] , 0)
dp[0]转移最大子段和
dp[1]转移dp[0]正在乘val的最大子段和
dp[2]转移dp[1]乘val后的最大子段和
ll ans = 0;
for(int i = 1; i <= n; ++i)
{
dp[i][0] = max(ll(0), dp[i - 1][0] + arr[i]);
dp[i][1] = max(dp[i][0], dp[i - 1][1] + arr[i] * k);
dp[i][2] = max(dp[i][1], dp[i - 1][2] + arr[i]);
ans = max(ans, dp[i][2]);
}