题意:
给定一个序列
如果满足以下条件,则称为“wave”:
1)至少含有两种元素;
2)奇数位各元素相同;
3)偶数位各元素相同;
4)奇数位置的元素与偶数位置的元素不同。
给你一个长度为n的序列,要求你找到最长的“wave”子序列。
思路:
暴力枚举两种不同的数(但是枚举的时候要注意位置是否满足条件) 说不清 还是看代码吧 有注释 好理解
#include<iostream>
#include<algorithm>
#include<string.h>
#include<map>
#include<queue>
#include<cmath>
#include<stack>
#include<cstdio>
#include<vector>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
const int N=1e6+5;
vector<int> v[105];
int main()
{
int n,c;
scanf("%d%d",&n,&c);
for(int i=0;i<n;i++)
{
int x;
scanf("%d",&x);
v[x].push_back(i);//把每个数x的位置记录下来
}
int ans=-1;
for(int i=1;i<=c;i++)
{
for(int j=1;j<=c;j++)
{
if(i==j)
continue;
int size1=v[i].size();
int size2=v[j].size();
int nowpos=0,cnt1=0,cnt2=0,sum=0;//nowpos记录上一个数的最后位置
while(1)
{
while(cnt1<size1&&v[i][cnt1]<nowpos)// 要找到比nowpos靠后的位置才算满足条件
cnt1++;
if(cnt1==size1)
break;
nowpos=v[i][cnt1];
sum++;
while(cnt2<size2&&v[j][cnt2]<nowpos)
cnt2++;
if(cnt2==size2)
break;
nowpos=v[j][cnt2];
sum++;
}
ans=max(ans,sum);
}
}
printf("%d\n",ans);
}