比賽的時候一開始把這題讀錯題了,錯了兩次才發現,然後想了一會,題目要求的那個數列,其實就是第一種情況,全部相等的數,第二種情況兩個不同的數 相互出現, 第一種情況好解決,關鍵是求第二種情況。對於第二種情況只要枚舉 n個數中任意兩個數所組成的最大可能長度即可。那麼就把相同的數的下標(i)分別保存在一個vector裡面。然後枚舉即可。比賽中最後5分鐘提交。。因為某處是k-1寫成了K。。跪了= =!! [cpp] #include <cmath> #include <ctime> #include <iostream> #include <string> #include <vector> #include <cstdio> #include <cstdlib> #include <cstring> #include <queue> #include <map> #include <set> #include <algorithm> #include <cctype> #include <stack> #include <deque> 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<int > 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<v[i].size()&&k<v[j].size()){ 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]<v[j][k-1]&&l<v[i].size()){ l++; } if(l<v[i].size()) temp++; } } else{ k++; } } if(temp>ans) ans=temp; } } printf("%d\n",ans); return 0; }