第一种情况好解决,关键是求第二种情况。对于第二种情况只要枚举 n个数中任意两个数所组成的最大可能长度即可。那么就把相同的数的下标(i)分别保存在一个vector里面。然后枚举即可。比赛中最后5分钟提交。。因为某处是k-1写成了K。。跪了= =!!
[cpp]
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long LL;
#define eps 10e-9
#define inf 0x3f3f3f3f
const int maxn = 5000;
int b[maxn],a[maxn],c[maxn];
vector v[maxn];
int hash[1000100];
int main(){
int n; int len=0;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&b[i]);
if(!hash[ b[i] ]){
v[ ++len].push_back(i);
hash[ b[i] ]=len;
}
else{
int cur = hash[ b[i] ];
v[cur].push_back(i);
}
}
if(n==1){
printf("1\n");
return 0;
}
int ans=0;
for(int i=1;i<=len;i++){
if(v[i].size()>ans) ans=v[i].size();
} www.2cto.com
for(int i=1;i<=len;i++){
for(int j=i+1;j<=len;j++){
int k=0, l=0; int temp=1;
while(l
if(v[j][k]>v[i][l]){
temp++;
l++; k++; if(l==v[i].size()) break;
if(v[i][l]>v[j][k-1]) temp++;
else{
while(v[i][l]
l++;
}
if(l
temp++;
}
}
else{
k++;
}
}
if(temp>ans) ans=temp;
}
}
printf("%d\n",ans);
return 0;
}