题意:
用人话说就是,给一串序列,然后里面连续递减的子序列作为一个大小为子序列长度的物品,其他元素作为容量为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 "); else printf("NO "); } }