题意
给定一个正整数序列x1,...,xn 。
(1)计算其最长不下降子序列的长度s。
(2)从序列中最多可不重复使用数字地取出多少个长度为s的不下降子序列。
(3)如果允许在取出的序列中多次使用x1和xn,求解(2)
题解
第一问很经典,数据范围一看,N^2地DP就完事儿了,做出DP数组还能帮助第二问的解答。
第二问中,每个点只能用一次,老规矩直接拆点。用DP做出以第i位开始,最长的不下降子序列长度是多少。
超级源点连上所有长度位S的点,所有长度为i的点连上超级汇点。若DP[i]==DP[j]+1,且i<j,a[i]>=a[j],那么i,j连边。跑最大流即可
第三问,改下第二问中首尾两个点的流量即可。
代码
#include<bits/stdc++.h>
#define MAXN 1109
#define MAXM 4000000+1109
#define INF 0x3fffffff
using namespace std;
int n,m;
int a[MAXN];
int DP[MAXN];
int S,T,Long;
int dis[MAXN],dl[MAXN];
int Head[MAXN],Next[MAXM],To[MAXM],FB[MAXM],Flow[MAXM],Cnt=0;//MAXMÒª¿¼ÂÇ·´±ß
int cur[MAXN];//µ±Ç°»¡ÓÅ»¯
int Ans=0;
void ADD(int x,int y,int z)
{
Cnt++;Next[Cnt]=Head[x];Head[x]=Cnt;To[Cnt]=y;FB[Cnt]=Cnt+1,Flow[Cnt]=z;
Cnt++;Next[Cnt]=Head[y];Head[