【网络流24题】最长不下降子序列问题

本文介绍了如何利用网络流解决最长不下降子序列的问题,包括经典的DP解法,以及允许不重复和重复使用序列中数字的场景。通过建立网络流模型并求解最大流来找到答案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Luogu 2766

题意

给定一个正整数序列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[
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值