最長不重複子序列的長度 - dp
阿新 • • 發佈:2018-12-30
題目連結:http://acm.zzuli.edu.cn/problem.php?id=2472
題意:求解最長不重複子序列的長度
#include<iostream> #include<cstdio> #include<algorithm> #include<string> #include<cstring> #include<queue> #include<cmath> #include<set> #include<map> #include<stack> #include<sstream> using namespace std; #define ll long long #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 const int INF=0x3f3f3f3f,mod=12345; const int N=100005; int a[N],dp[N]; int t,n; void solve(){ int last_start=0;//上次最長子串的起始位置 int maxlen=0; dp[0]=1;//dp[i]:=從i位置向0座標走,最長不重複子序的長度 for(int i=1;i<n;i++){ for(int j=i-1;j>=last_start;--j){//遍歷到上一個子串的起始位置 if(a[j]==a[i]){ dp[i]=i-j; last_start=j+1; break; } else if(j==last_start){//無重複 dp[i]=dp[i-1]+1; } } if(dp[i]>maxlen){ maxlen=dp[i]; } } if(maxlen==0)maxlen=1; printf("%d\n",maxlen); } int main(){ scanf("%d",&t); while(t--){ scanf("%d",&n); memset(dp,0,sizeof(dp)); for(int i=0;i<n;i++)scanf("%d",&a[i]); solve(); } } /* 10 10 1 2 3 3 2 4 5 6 7 10 */