标签:Beautiful 最大值 define 区间 Array include 一部分 DP 乘法
https://codeforces.com/contest/1155/problem/D
这个题目还是不会写,挺难的,最后还是lj大佬教我的。
这个题目就是要分成三段来考虑,
第一段就是不进行乘,就是直接求这一个区间的最大的一段区间的最大值。
第二段就是后面有一部分进行乘法,前面有一部不进行乘法。这个也同样求一个区间的最大值。
第三段就是前面有一部分和后面有一部分不进行乘法,中间有一部分进行乘法,同样求这个区间的最大值。
#include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<string> #include<queue> #include<vector> #define inf 0x3f3f3f3f #define debug(x) cout<<"-----"<<" x = "<<x<<"-----"<<endl using namespace std; typedef long long ll; const int maxn = 3e5 + 10; ll dp1[maxn], dp2[maxn], dp3[maxn]; ll a[maxn]; ll max_(ll x,ll y,ll z) { ll ans = max(x, y); return max(ans, z); } int main() { int n, k; ll ans = 0; scanf("%d%d", &n, &k); for (int i = 1; i <= n; i++) scanf("%lld", &a[i]); for (int i = 1; i <= n; i++) { dp1[i] = a[i] + max(1ll * 0, dp1[i - 1]); ans = max(ans,dp1[i]); } for (int i = 1; i <= n; i++) { dp2[i] = a[i] * k + max_(dp1[i - 1], dp2[i - 1],0); ans = max(dp2[i], ans); } dp3[2] = dp2[1] + a[2]; ans = max(ans, dp3[2]); for (int i = 3; i <= n; i++) { dp3[i] = a[i] + max_(dp2[i - 1], dp3[i - 1],0); ans = max(ans, dp3[i]); } printf("%lld\n", ans); return 0; }
标签:Beautiful,最大值,define,区间,Array,include,一部分,DP,乘法 来源: https://www.cnblogs.com/EchoZQN/p/10908427.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。