题目描述
解题思路:首先先对输入的数组进行去重,得到不重复的数组a,并在数组a最开始和最后添加0元素。然后对a中所有非零元素维护一个的map,其中key为a中所有非零元素递增排列,value为该元素对非零段的影响值(即,若a[i]<a[i-1],a[i]<a[i+1]则去掉a[i],非零段数目将+1。若a[i]>a[i-1],a[i]>a[i+1]则去掉a[i],非零段数目将-1。由于去重,则不存在等于情况)
然后初始化dp0为初始非零段数目,则dp[i]=dp[i-1]+map中该元素对非零段的影响值。i<map.size。
时间复杂度:O(A中非零非重复值的个数)
#include<iostream>
#include<vector>
#include<map>
#include<algorithm>
#include<math.h>
using namespace std;
int a[500002];
int main()
{
int n;
cin >> n;
int j = 1;
map<int, int>temp;
//,去重,收尾添加0,初始化a数组,temp
for (int i = 1; i <= n;++i)
{
int k;
cin >> k;
if (k != a[j - 1]||k==0&&j==1)
{
a[j] = k;
j++;
if (k != 0)temp.insert(pair<int,int>(k,0));
}
}
//计算初始时非零段数目
int dp0 = 0;
int index0 = 0;
for (int i = 1; i <= j+1; i++)
{
if (a[i] == 0 && index0 != i - 1)
{
dp0++;
}
if (a[i] == 0)index0 = i;
}
//计算temp数组
int res = dp0;
for (int i = 1; i <= j; ++i)
{
if (a[i] != 0)
{
if (a[i - 1] > a[i] && a[i + 1] > a[i])
{
temp[a[i]]++;
}
if (a[i - 1] < a[i] && a[i + 1] < a[i])
{
temp[a[i]]--;
}
}
}
//按temp中的元素,进行动态规划
map<int, int>::iterator it=temp.begin();
map<int, int>::iterator itend = temp.end();
while (it != itend)
{
dp0 += it->second;
it++;
res = max(res, dp0);
}
cout << res;
return 0;
}