#include<bits/stdc++.h>
using namespace std;
#define ll long long
int t,n,a[20005],f[20005][20005];
inline int max(int a,int b){
return a>b?a:b;
}
int main (){
cin>>t;
while(t--){
cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
for(int i=0;i<=n;i++) memset(f[i],0,(n+1)*sizeof(int));
for(int i=n;i>=0;i--){
for(int j=n;j>=0;j--){
int k=max(i,j)+1;
if(k==n+1) continue;
f[i][j]=max(f[k][j]+(a[i]==a[k]?a[i]:0),f[i][k]+(a[j]==a[k]?a[j]:0));
}
}
cout<<f[0][0]<<'\n';
}
return 0;
}
思路是f[i,j]表示red序列最后一个为i,blue序列最后一个为j时总体最大值;
转移公式是由dfs代码得到的: dfs(i,j,k)=max(dfs(k,j,k+1),dfs(i,k,k+1));
推出
f[i,j]=maxk=max(i,j)+1(f[k,j]+a[k]a[k]=a[i],f[i,k]+a[k]a[k]=a[j])
O(n2)的复杂度前50%的数据不会TLE,能过样例一但不知道正确性咋样
有没有dalao帮我看看会挂多少分