#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 1000+5;
long long dp[maxn][maxn];
char nums[maxn];
int main() {
// freopen("data.in", "r", stdin);
int t;
scanf("%d", &t);
int n;
while(t--){
scanf("%d", &n);
int val;
for(int i = 1; i <= n; ++i) {
scanf("%d", &nums[i]);
}
memset(dp, 0, sizeof(dp));
//有偶数个人,所有人都必须互相敬酒,而且不能交叉,问在这种情况下,互相敬酒的人牌子相同的最大对数
//为了保证一个区间内不想交,首先要保证这个区间的人数必须是偶数,如果区间人数是是奇数,那必定会存在交叉情况。那么在区间DP的时候中间值K也必须保证是2的倍数。
for(int l = 2; l <= n; l+=2) {//区间长度
for(int i = 1; i <= n-l+1; i++) {
int j = i+l-1;
dp[i][j] = dp[i+1][j-1];//初值
if(nums[i] == nums[j])//配对
dp[i][j]++;
for(int 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;
}
POJ 3056 The Bavarian Beer Party(区间DP)
猜你喜欢
转载自blog.csdn.net/ccshijtgc/article/details/81027537
今日推荐
周排行