POJ 3056 The Bavarian Beer Party(区间DP)

The Bavarian Beer Party

#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;
}

猜你喜欢

转载自blog.csdn.net/ccshijtgc/article/details/81027537