问题描述

LG2766


题解

\(\mathrm{Subtask 1}\)

一个求最长不下降子序列的问题,发现\(n \le 500\),直接\(O(n^2)\)暴力DP即可。

\(\mathrm{Subtask 2}\)

设\(opt_i\)代表区间\([1,i]\),且以\(i\)为结尾的最长不下降子序列。

考虑拆点,把\(i\)拆成\(i\)和\(i+n\)。

如果\(opt_i=1\),则从源点向\(i\)连边。

如果\(opt_i=n\),则从\(i+n\)向汇点连边。

以上两种边边权均为\(INF\)。

接下来从\(i\)向\(i+n\)连边,边权为\(1\),代表每个数只能使用一次。

接下来枚举\(i,j\),且\(i<j\),\(\forall a_j \le a_i\)且\(opt_j=opt_i+1\),在\(j+n,i\)之间连边,边权为\(1\)。

跑\(\mathrm{Dinic}\)即可。

\(\mathrm{Subtask 3}\)

只需要解除\(1\)和\(n\)的流量限制即可。


\(\mathrm{Code}\)

#include<bits/stdc++.h>
using namespace std; template <typename Tp>
void read(Tp &x){
x=0;char ch=1;int fh;
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-'){
fh=-1;ch=getchar();
}
else fh=1;
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
x*=fh;
} const int maxn=507; int n,a[maxn],len=1;
int opt[maxn],ans;
int S,T;
int Head[20000],v[200000],w[200000],tot=1;
int d[20000],Next[200000];
bool bfs(){
memset(d,0,sizeof(d));
queue<int>q;q.push(S);d[S]=1;
while(!q.empty()){
int x=q.front();q.pop();
for(int i=Head[x];i;i=Next[i]){
if(d[v[i]]||!w[i]) continue;
q.push(v[i]);d[v[i]]=d[x]+1;
if(v[i]==T) return true;
}
}
return false;
} int dfs(int x,int flow){
if(x==T) return flow;
int rest=flow;
for(int i=Head[x];i&&rest;i=Next[i]){
if(d[v[i]]!=d[x]+1||!w[i]) continue;
int k=dfs(v[i],min(rest,w[i]));
if(!k) d[v[i]]=0;
else{
w[i]-=k,w[i xor 1]+=k;
rest-=k;
}
}
return flow-rest;
} void add(int x,int y,int z){v[++tot]=y,Next[tot]=Head[x],Head[x]=tot,w[tot]=z;} int main(){
read(n);
for(int i=1;i<=n;i++){
read(a[i]);opt[i]=1;
}
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
if(a[i]>=a[j]){
opt[i]=max(opt[i],opt[j]+1);
len=max(opt[i],len);
}
}
}
printf("%d\n",len);S=n*2+1,T=S+1;
for(int i=1;i<=n;i++){
if(opt[i]==1) add(S,i,1),add(i,S,0);
}
for(int i=1;i<=n;i++){
if(opt[i]==len) add(i+n,T,1),add(T,i+n,0);
}
for(int i=1;i<=n;i++) add(i,i+n,1),add(i+n,i,0);
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
if(a[i]>=a[j]&&opt[i]==opt[j]+1){
add(j+n,i,1);add(i,j+n,0);
}
}
}
while(bfs()){
int t;
while(t=dfs(S,0x3f3f3f3f)) ans+=t;
}
printf("%d\n",ans);
add(1,1+n,0x3f3f3f3f);add(n+1,1,0);
add(S,1,0x3f3f3f3f);add(1,S,0);
if(opt[n]==len) add(n,n+n,0x3f3f3f3f),add(2*n,n,0),add(n*2,T,0x3f3f3f3f),add(T,n*2,0);
while(bfs()){
ans+=dfs(S,0x3f3f3f3f);
}
printf("%d\n",ans);
return 0;
}

LG2766 最长不下降子序列问题 最大流 网络流24题的更多相关文章

  1. 【Luogu】P2766最长不下降子序列问题(暴力网络流)

    题目链接 水题qwq,数据都那么水. 我要是出数据的人我就卡$n^3$建图. qwq. 然而这么水的题我!居!然!没!有!1!A!!还!提!交!了!五!遍!!! md从现在开始要锻炼1A率了 看我从今 ...

  2. P2766 最长不下降子序列问题 题解(网络流)

    题目链接 最长不下降子序列问题 解题思路 分成三小问解决. 第一小问,求\(LIS\),因为\(n<=500\),直接\(O(N^2)\)暴力求解即可. 第二三小问,建立模型用网络流求解. 对于 ...

  3. 最长不下降子序列(LIS)

    最长上升子序列.最长不下降子序列,解法差不多,就一点等于不等于的差别,我这里说最长不下降子序列的. 有两种解法. 一种是DP,很容易想到,就这样: REP(i,n) { f[i]=; FOR(j,,i ...

  4. 最长不下降子序列 O(nlogn) || 记忆化搜索

    #include<stdio.h> ] , temp[] ; int n , top ; int binary_search (int x) { ; int last = top ; in ...

  5. tyvj 1049 最长不下降子序列 n^2/nlogn

    P1049 最长不下降子序列 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数第二行n个数 输出格式 ...

  6. 最长不下降子序列的O(n^2)算法和O(nlogn)算法

    一.简单的O(n^2)的算法 很容易想到用动态规划做.设lis[]用于保存第1~i元素元素中最长不下降序列的长度,则lis[i]=max(lis[j])+1,且num[i]>num[j],i&g ...

  7. 最长不下降子序列//序列dp

    最长不下降子序列 时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数第二行n个数 输出格式 最长不下降 ...

  8. 【tyvj】P1049 最长不下降子序列

    时间: 1000ms / 空间: 131072KiB / Java类名: Main 描述 求最长不下降子序列的长度 输入格式 第一行为n,表示n个数 第二行n个数 输出格式 最长不下降子序列的长度 测 ...

  9. hdu 4604 Deque(最长不下降子序列)

    从后向前对已搜点做两遍LIS(最长不下降子序列),分别求出已搜点的最长递增.递减子序列长度.这样一直搜到第一个点,就得到了整个序列的最长递增.递减子序列的长度,即最长递减子序列在前,最长递增子序列在后 ...

随机推荐

  1. [Taro] taro中定义以及使用全局变量

    taro中定义以及使用全局变量 错误的姿势 // app.tsx文件中 class App extends Component { componentDidMount() { this.user = ...

  2. Nginx Rewrite域名及资源重定向

    一.正则匹配     1.匹配规则         ^$  标识符匹配后面跟-一个字符串.匹配字符串后将停止对后续的正则表达式进行匹配,如location ^~/images/,在匹配了/images ...

  3. luogu1368 工艺

    题目链接 思路 \(SAM\)练手题,将原串重复一遍插入到\(SAM\)中,然后贪心走长度为n的一个路径即可. 不用担心会直接走到终点,根据\(SAM\)的构造方式可以发现会先走到前面的路径. 代码 ...

  4. 端口转发之 nc

    nc使用方法: Ncat 7.50 ( https://nmap.org/ncat ) Usage: ncat [options] [hostname] [port] Options taking a ...

  5. PM学习笔记(一):解构产品经理

    1.产品定义:什么是产品 来自百度百科(链接)的解释:        产品是指能够供给市场 [1]  ,被人们使用和消费,并能满足人们某种需求的任何东西,包括有形的物品.无形的服务.组织.观念或它们的 ...

  6. win10怎么打开服务界面?

    在键盘上同时点击“win+R”键弹出运行界面,输入services.msc,按确定. 这时就弹出了服务的界面,如图:

  7. 一个简单的利用 WebClient 异步下载的示例(三)

    继续上一篇 一个简单的利用 WebClient 异步下载的示例(二) 后,继续优化它. 1. 直接贴代码了: DownloadEntry: public class DownloadEntry { p ...

  8. Winform 通过 WebBrowser 与 JS 交互

    Winform 通过 WebBrowser 与 JS 交互 魏刘宏 2019.08.17 之前在使用 Cef (可在 Winform 或 WPF 程序中嵌入 Chrome 内核的网页浏览器的组件)时, ...

  9. FPGA最小系统设计

    以EP4CE6E22I7为例,设计FPGA最小系统. 程序存储设计 一般使用EPCS4I8N: FPGA_DATA0:13 FPGA_DCLK :12 FPGA_nCS:8 ASDO:6 时钟 待续

  10. C# WebAPI 文件在线预览

    最近在写一个移动端API接口,其中有一个需求:接口返回附件url地址让手机端调用实现文件在线预览.大体实现思路:把doc.xls等文本格式文件转换为pdf,转换后的pdf文件存放在服务器上面,方便第二 ...