Codeforces1234E(暴力/前缀和)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces1234E(暴力/前缀和)相关的知识,希望对你有一定的参考价值。
参考技术A https://codeforces.com/contest/1234/problem/E法一:
观察到, 与 相比,只有 和 的下标发生了改变,所以在 中,只有值为 和 的 参与的项发生了改变。所以可以一开始就把 和对应的项关联并算出 ,当 改变时,不用重新计算 ,只需再原有 的基础上修改某些项的值即可。又除了头尾的 都被枚举两次: 和 ,枚举完所有的 后一定覆盖了全部的 ,故最多修改 次;综上,时间复杂度为 。
注意开long long,abs要用long long版本。
法二: https://blog.csdn.net/BeNoble_/article/details/101985236
对于 和 ,不妨设 ,对于每一个 ,
仅与 的相对位置有关:
时, 就是它的值, 。
时, , 。
时, , , 。
时, , , 。
时, 。
所以问题转化为区间修改+单点查询,令 ,不断用相邻的 更新 即可。
增量元素之间的最大差值——前缀dp
文章目录
题目
题目解析
法一:暴力枚举
此题由于是简单题,所以直接可以暴力枚举。暴力枚举的时候我们也可以考虑优化一下,比如外层枚举 n u m s [ i ] nums[i] nums[i] 的时候,内层直接找右边的最大值。
代码如下:
class Solution
public:
int maximumDifference(vector<int>& nums)
int n = nums.size();
int ret = INT_MIN,mx;
for(int i=0;i<n;i++)
mx = *max_element(nums.begin()+i,nums.begin()+n);
if(mx>nums[i])
ret = max(ret,mx-nums[i]);
if(ret==INT_MIN)return -1;
return ret;
;
法二:dp优化
很明显,时间复杂度实际上还是 O ( n 2 ) O(n^2) O(n2) ,我们可以通过动态规划,提前求出 n u m s [ i ] nums[i] nums[i] 之前的最小值,然后我们就可以直接通过 n u m s [ i ] − d p m i n [ i − 1 ] nums[i]-dp_min[i-1] nums[i]−dpmin[i−1] 求得,此时时间复杂度被优化为了 O ( n ) O(n) O(n) ,但空间复杂度也上升到了 O ( n ) O(n) O(n) 。
代码如下:
class Solution
public:
const int maxn = 0x3f3f3f3f;
int maximumDifference(vector<int>& nums)
//计算dp值
int n = nums.size();
int dp_min[n];
memset(dp_min,0x3f,sizeof(dp_min));
dp_min[0] = nums[0];
int ret = INT_MIN;
for(int i=1;i<n;i++) dp_min[i] = min(dp_min[i-1],nums[i]);
//得出答案
for(int i=0;i<n;i++)
if(i>0&&nums[i]>dp_min[i-1])
ret = max(ret,nums[i]-dp_min[i-1]);
if(ret==INT_MIN)return -1;
return ret;
;
法三:进一步优化空间复杂度
我们在 d p dp dp 求解的时候发现,我们转移的状态依赖并未跨维度,而仅仅只和上一个状态 d p [ i − 1 ] dp[i-1] dp[i−1] 相关,所以我们实际上只需要一个变量来记录 n u m s [ i ] nums[i] nums[i] 前的最小值,故把所有的处理放到一个循环中实现即可。
代码如下:
class Solution
public:
int maximumDifference(vector<int>& nums)
int n = nums.size();
int ret = -1, premin = nums[0];
for (int i = 1; i < n; ++i)
if (nums[i] > premin)
ret = max(ret, nums[i] - premin);
else
premin = nums[i];
return ret;
;
以上是关于Codeforces1234E(暴力/前缀和)的主要内容,如果未能解决你的问题,请参考以下文章
codeforces 1555 C. Coin Rows (暴力+前缀和)
codeforces 1555 C. Coin Rows (暴力+前缀和)
Codeforces 831C--Jury Marks (暴力)