设f[i][j]表示以i位置为第一个序列的结尾,第一个序列的长度为j,第二个序列的结尾的最小值
那么对于f[i][j],有转移$f[i+1][j+1]=min{f[i+1][j+1],f[i][j]}$;$f[i+1][i-j+1]=min{f[i+1][i-j+1],a[i+1]}$,如果能满足递增的话
1 #include<bits/stdc++.h> 2 #define CLR(a,x) memset(a,x,sizeof(a)) 3 #define MP make_pair 4 using namespace std; 5 typedef long long ll; 6 typedef unsigned long long ull; 7 typedef pair<int,int> pa; 8 const int maxn=2e3+10; 9 10 inline ll rd(){ 11 ll x=0;char c=getchar();int neg=1; 12 while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();} 13 while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar(); 14 return x*neg; 15 } 16 17 int M,N,a[maxn],tmp[maxn],f[maxn][maxn]; 18 19 int main(){ 20 //freopen("","r",stdin); 21 int i,j,k; 22 for(M=rd();M;M--){ 23 N=rd(); 24 for(i=1;i<=N;i++) a[i]=tmp[i]=rd(); 25 sort(tmp+1,tmp+N+1);int m=unique(tmp+1,tmp+N+1)-tmp; 26 for(i=1;i<=N;i++) 27 a[i]=lower_bound(tmp+1,tmp+m,a[i])-tmp; 28 CLR(f,127); 29 f[1][1]=0; 30 for(i=1;i<N;i++){ 31 for(j=0;j<m;j++){ 32 if(a[i+1]>f[i][j]) f[i+1][i+1-j]=min(f[i+1][i+1-j],a[i]); 33 if(a[i+1]>a[i]) f[i+1][j+1]=min(f[i+1][j+1],f[i][j]); 34 } 35 } 36 if(f[N][N>>1]<=1e8) printf("Yes! "); 37 else printf("No! "); 38 } 39 return 0; 40 }