正题


题目大意

求最长不下降子序列和可以取出多少以及允许多次使用一些数时可以取出多少个。


解题思路

第一问dp求,且保存以xxx开头的最长长度fxf_xfx​。
第二问考虑网络流。
我们对于每个数字以fif_ifi​的不同分层,然后每次从下往上一层连接,然后对于每个点拆开以限制每个点的流量保证每个点只取一次就好了。
第三问在第二问的基础上将点1和点n的流量限制去掉就好了。


code

#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
struct line{int to,next,c;
}a[200001];
queue<int>f;
int n,d[1001],s,e,num[1001],l,tot,ls[1001],ans;
int ff[1001];
void addl(int x,int y,int z)
{a[++tot].to=y;a[tot].next=ls[x];a[tot].c=z;ls[x]=tot;a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;
}
bool bfs()
{memset(d,0,sizeof(d));d[s]=1;f.push(s);while (!f.empty()){int x=f.front();for (int i=ls[x];i>=0;i=a[i].next){int y=a[i].to;if (a[i].c>0 && d[y]==0){d[y]=d[x]+1;f.push(y);}}f.pop();}if (d[e]) return true;else return false;
}
int dinic(int x,int flow)
{int rest=0,k;if (x==e) return flow;for (int i=ls[x];i>=0;i=a[i].next){int y=a[i].to;if (a[i].c>0&&d[y]==d[x]+1&&flow>rest){rest+=(k=(dinic(y,min(flow-rest,a[i].c))));a[i].c-=k;a[i^1].c+=k;}}if (!rest) d[x]=0;return rest;
}
int main()
{tot=-1;memset(ls,-1,sizeof(ls));scanf("%d",&n);s=0;e=2*n+1;for (int i=1;i<=n;i++)scanf("%d",&num[i]);for (int i=n;i>=1;i--){ff[i]=max(ff[i],1);for (int j=i+1;j<=n;j++)if (num[i]<=num[j]){ff[i]=max(ff[i],ff[j]+1);}l=max(l,ff[i]);}printf("%d\n",l);if (l==1){printf("%d\n%d",n,n);return 0;}for (int i=1;i<=n;i++){addl(2*i-1,2*i,1);if (ff[i]==l)addl(s,2*i-1,1);if (ff[i]==1)addl(2*i,e,1);}for (int i=1;i<n;i++)for (int j=i+1;j<=n;j++)if (num[i]<=num[j]&&ff[i]==ff[j]+1) addl(2*i,2*j-1,1);while (bfs()) ans+=dinic(s,1e9);printf("%d\n",ans);if (ff[1]==l)addl(1,2,1e9),addl(s,1,1e9);addl(2*n-1,2*n,1e9);addl(2*n,e,1e9);//ans=0;while (bfs()) ans+=dinic(s,1e9);printf("%d",ans);
}

P2766-最长不下降子序列问题【网络流,dp】相关推荐

  1. 最大流 ---- 最大不相交路径数 ---- P2766 最长不下降子序列问题(网络流24题)

    题目链接 最多不相交路径 这种问题变化比较多,但都能表示成以下形式: 已知一些路径,每个节点只能属于一条路径,求能选择多少条路径使它们不相交. 主要的方法是拆点,将一个点拆成两个,然后连边,容量表示该 ...

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

    P2766 最长不下降子序列问题 求解LIS长度k 求解长度为k的不下降子序列个数,并且一个数只能使用一次 求解长度为k的不下降子序列个数,第一个数和第n个数可以使用任意次 首先利用dp可以求解出以每 ...

  3. 洛谷 - P2766 最长不下降子序列问题(最大流+动态规划+思维建边)

    题目链接:点击查看 题目大意:给出一个由n个数组成的序列,有三个子问题: 求出当前数列的最长不下降子序列的长度len 如果每个数最多只能使用一次,问最多可以组成多少个长度为len的最长不下降子序列 如 ...

  4. 洛谷2766:[网络流24题]最长不下降子序列问题——题解

    https://www.luogu.org/problemnew/show/P2766 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出 ...

  5. 【P2766】 最长不下降子序列问题

    题目描述 «问题描述: 给定正整数序列x1,...,xn . (1)计算其最长不下降子序列的长度s. (2)计算从给定的序列中最多可取出多少个长度为s的不下降子序列. (3)如果允许在取出的序列中多次 ...

  6. 最长不下降子序列(推广问题)

    最长不下降子序列问题的定义:在一个序列中,找到一个最长的子序列,其中这个序列是非递减的 我们可以把这个非递减推广,其实非递减就是一种顺序,那么我们可以把定义推广到:给出一个顺序序列.目标序列中,在目标 ...

  7. 最长不下降子序列java代码_浅谈最长不下降子序列与最长上升子序列

    唔,最长不下降子序列与最长上升子序列曾是困扰蒟蒻多时的一个问题,应该也有一些人分不清这2个的求法吧. 首先n^2算法肯定是都能分清的,因为不下降和上升的区别是连续的2个能不能相等,只需要在判断的时候判 ...

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

    转帖 最长不下降子序列的O(n^2)算法和O(nlogn)算法 最长不下降子序列(LIS:Longest Increasing Subsequence) //用句通俗的话说,我讲的很通俗易懂~~ 问题 ...

  9. CodeForces - 1437E Make It Increasing(确定首尾的最长不下降子序列)

    题目链接:点击查看 题目大意:给出一个长度为 n 的序列,现在有 m 个位置被锁定,也就是无法进行操作,每次操作可以选择一个没有被锁定的位置,将其更改为任意数值,现在问最少进行多少次操作,可以使得整个 ...

最新文章

  1. 表格布局(TableLayout)及重要属性
  2. 多种缺陷管理软件简介
  3. python meshgrid_torch.meshgrid()和np.meshgrid()的区别
  4. 计蒜客NOIP模拟赛4 D2T2 跑步爱天天
  5. 网页java在div输出内容_JS实现读取xml内容并输出到div中的方法示例
  6. try-catch-finally的执行顺序
  7. 计算机程序辅助拼货,拼货
  8. 概率矩阵分解模型 PMF
  9. 卡巴斯基离线升级方法图解
  10. from PyQt4 import QtGui,QtCore出错
  11. 使用注册表删除没用的DLL文件
  12. demonstration记忆_单词记忆法
  13. 数据集介绍 - Matting and Segmentation
  14. H3C路由器静态NAT_不同网段的两个路由器如何互通?
  15. Python —— 爬取成果微博相册图片 ——明星
  16. WIN10 + Ubuntu18.04 双系统安装教程(新机)
  17. 计算机网络(谢希仁第7版)课后答案—— 第七章网络安全
  18. RabbitMQ的Routing 路由模式(Direct)
  19. 输入身份证号自动算出年龄,出生日期,性别
  20. 蓝牙认证,蓝牙BQB认证,蓝牙BQB测试内容,蓝牙BQB认证多少钱?蓝牙BQB认证流程

热门文章

  1. mysql序列increment_MySQL 序列 AUTO_INCREMENT
  2. 安装linux6.10 I386系统教程,一看就懂的Centos6.10安装教程
  3. 算法题目——二次函数三分求极值(HDU-3714)
  4. 详解队列在前端的应用,深剖JS中的事件循环Eventloop,再了解微任务和宏任务
  5. 高等数学下-赵立军-北京大学出版社-题解-练习9.2
  6. [设计模式]策略模式
  7. 网络编程-TCP/IP协议栈-TCP协议
  8. h5应用 vue 钉钉_uniapp开发一个小视频应用(一)
  9. cma检测_CMA检测方法
  10. java foreach跳出本次循环_Java中提供三种常用的循环语句