CF1382D.Unmerge(背包)

题意:

用人话说就是,给一串序列,然后里面连续递减的子序列作为一个大小为子序列长度的物品,其他元素作为容量为1的单个物品,询问是否可能存在一些物品使得他们的容量之和恰好为n。(虽然我推导到这一步花了很久很久...)

题解:

就是背包一遍就行,考试的时候时间不够了写的乱七八糟。

#include<bits/stdc++.h>
using namespace std;
const int maxn=2005;
int n,t;
int p[maxn*2];
int cnt[2];
int dp[2*maxn]={0};
int main () {
    scanf("%d",&t);
    while (t--) {
        scanf("%d",&n);
        for (int i=1;i<=2*n;i++) scanf("%d",&p[i]);
        int f=0;
    
        vector<int> tot; 
        for (int i=1;i<=2*n;i++) {
            int j;
            for (j=i;j<=2*n;j++)
                if (p[j]>p[i]) break;
            tot.push_back(j-i);
            i=j-1;
        }
        f=0;
        for (int i=0;i<=2*n;i++) dp[i]=0;
        for (int i=0;i<tot.size();i++) {
            for (int j=n;j>=tot[i];j--)
                dp[j]=max(dp[j],dp[j-tot[i]]+tot[i]);
        }
        
        if (dp[n]==n)
            printf("YES\n");
        else
            printf("NO\n");
    }
}

 

posted @ 2020-07-22 16:04  zlc0405  阅读(187)  评论(0编辑  收藏  举报