题目:http://codeforces.com/contest/1155/problem/D
给你n,x,一个n个数的序列,你可以选择一段区间,区间的数都乘以x,然后求出最大字段和
竟然是很简单的dp!!!
#include <bits/stdc++.h> using namespace std; #define ll long long const ll zero = 0; ll n,x,k,dp[3],cnt; int main() { scanf("%lld%lld",&n,&x); memset(dp,0,sizeof(dp)); for(ll i = 1;i <= n;i++) { scanf("%lld",&k); dp[0] = max(zero , dp[0] + k); // 第一种状态 dp[1] 求最大字段和即可 dp[1] = max(dp[0] , dp[1] + k*x); // 第二种状态 dp[2]应该是前面的最大字段和+当前的数 dp[2] = max(dp[1] , dp[2] + k); // 第三种状态 dp[3]显然是前面两段的和再加上当前 cnt = max(cnt , dp[2]); } printf("%lld",cnt); return 0; }