//配对,但不能有交叉,求最大对数,这类问题要用区间来表示,配对的可能是找到i,j标签一样
//dp[i][j]从i到j按顺时针过来表示的区间的最大匹配数
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int maxn=1012;
int dp[maxn][maxn],s[maxn],n,t;
int main()
{
cin>>t;
while(t--)
{
scanf("%d",&n);
int i,j,k,l;
for(i=1; i<=n; i++)
{
scanf("%d",&s[i]);
for(j=1; j<=n; j++)
{
dp[i][j]=0;
}
}
for(l=1; l<n; l+=2)
for(i=1; i+l<=n; i++)
{
j=i+l;
dp[i][j]=dp[i+1][j-1]+(s[i]==s[j]);
for(k=i+1; k<j; k+=2)
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]);
}
printf("%d\n",dp[1][n]);
}
return 0;
}
/*
6
8
1 2 2 1 3 3 4 4
8
1 2 2 3 1 3 4 4
6
1 2 2 1 3 3
22
1 7 1 2 4 2 4 9 1 1 9 4 5 9 4 5 6 9 2 1 2 9
*/
poj 3056 区间dp
最新推荐文章于 2016-08-30 20:08:18 发布