题目

啥都不会只能来写写题解了

第一问先搞一个\(dp\)吧,小学生水平的\(dp\)

第二问要求每一个点只能使用一次,显然要先拆点,把\(i\)拆成\(i\)与\(i'\),之后\(i\)于\(i'\)连容量为\(1\)的边

之后能产生长度为\(ans\)的LIS需要满足什么条件呢,显然得从一个\(dp[i]=1\)的点开始,从一个\(dp[i]=ans\)的点结束,否则就不可能产生长度为\(ans\)的LIS了

同时我们还得考虑到我们这是一个\(dp\),所以只能是让\(i\)的所有转移点向\(i\)连边

第三问取消\(1\)和\(n\)的限制就好了

代码

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
#define maxn 1105
#define re register
#define LL long long
#define inf 99999999
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read()
{char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
struct E{int v,nxt,w,f;}e[2000005];
int dp[maxn],a[maxn],ans,n,num=1,S,T,tot,cnt;
int d[maxn],head[maxn],cur[maxn];
inline void add(int x,int y,int z) {e[++num].v=y;e[num].w=z;e[num].nxt=head[x];head[x]=num;}
inline void C(int x,int y,int z) {add(x,y,z),add(y,x,0);}
inline int BFS()
{std::queue<int> q;for(re int i=S;i<=T;i++) d[i]=0,cur[i]=head[i];d[S]=1,q.push(S);while(!q.empty()){int k=q.front();q.pop();for(re int i=head[k];i;i=e[i].nxt)if(!d[e[i].v]&&e[i].w>e[i].f) d[e[i].v]=d[k]+1,q.push(e[i].v);}return d[T];
}
int dfs(int x,int now)
{if(x==T||!now) return now;int flow=0,ff;for(re int& i=cur[x];i;i=e[i].nxt)if(d[x]+1==d[e[i].v]){ff=dfs(e[i].v,min(e[i].w-e[i].f,now));if(ff<=0) continue;now-=ff,flow+=ff;e[i].f+=ff,e[i^1].f-=ff;if(!now) break;}return flow;
}
int main()
{n=read();if(n==1) {puts("1");puts("1"),puts("1");return 0;}for(re int i=1;i<=n;i++) a[i]=read(),dp[i]=1;for(re int i=1;i<=n;i++)for(re int j=1;j<i;j++)if(a[j]<=a[i]) dp[i]=max(dp[i],dp[j]+1);for(re int i=1;i<=n;i++) ans=max(ans,dp[i]);S=0,T=n+n+1;    for(re int i=1;i<=n;i++) C(i,i+n,1);for(re int i=1;i<=n;i++)if(dp[i]==1) C(S,i,1);for(re int i=1;i<=n;i++)if(dp[i]==ans) C(i+n,T,1);for(re int i=1;i<=n;i++)for(re int j=1;j<i;j++)if(a[j]<=a[i]&&dp[i]==dp[j]+1) C(j+n,i,1);while(BFS()) tot+=dfs(S,inf);num=1;memset(e,0,sizeof(e)),memset(head,0,sizeof(head));for(re int i=2;i<n;i++) C(i,i+n,1);for(re int i=2;i<n;i++)if(dp[i]==1) C(S,i,1);for(re int i=2;i<n;i++)if(dp[i]==ans) C(i+n,T,1);C(1,1+n,inf),C(n,n+n,inf);if(dp[1]==1) C(S,1,inf);if(dp[1]==ans) C(1+n,T,1);if(dp[n]==1) C(S,n,1);if(dp[n]==ans) C(n+n,T,inf);for(re int i=1;i<=n;i++)for(re int j=1;j<i;j++)if(a[j]<=a[i]&&dp[i]==dp[j]+1) C(j+n,i,1);while(BFS()) cnt+=dfs(S,inf);printf("%d\n%d\n%d\n",ans,tot,cnt);return 0;
}

转载于:https://www.cnblogs.com/asuldb/p/10293207.html

【[网络流二十四题]最长不下降子序列问题】相关推荐

  1. 网络流二十四题 ————(二十一)、P3358 最长k可重区间集问题 费用流并联与串联选择

    https://www.luogu.com.cn/problem/solution/P3358 洛谷大佬们题解写的很棒,我就不献丑了. 说下我的理解吧,可以把这个限制过程当初物理中的电路并联与串联.流 ...

  2. 网络流二十四题之二十二 —— 火星探险问题

    火星探险问题 Description 火星探险队的登陆舱将在火星表面着陆,登陆舱内有多部障碍物探测车. 登陆舱着陆后,探测车将离开登陆舱向先期到达的传送器方向移动. 探测车在移动中还必须采集岩石标本. ...

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

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

  4. 西安交大计算机考研软件工程编程题库(二十四)

    西安交大计算机考研软件工程编程题库(二十四) 鄙人今年备考,主要目的在于记录学习历程,望道友们勿喷~ 希望能做到每日一题~ 开始炼丹~ 上篇链接:西安交大计算机考研软件工程编程题库(二十三) 下篇链接 ...

  5. 美学心得(第二百二十四集)罗国正

    美学心得(第二百二十四集) 罗国正 (2021年7月) 2987.清朝画家方士庶认为:绘画是"于天地之外,别构一种灵奇"."因心造境,以手运心"."山 ...

  6. 转;三宫九观二十四坊——摘自苏州热线

    三宫九观二十四坊,苏州城内著名的古迹. 1. 三宫: ⑴皇宫-在皇废基东边,本名万寿宫,今称旧皇宫,是康熙五十九年,巡抚吴存礼所建,供着皇帝的生位,每逢万寿-皇帝的诞辰,百官都要去朝拜,北京来了诏书, ...

  7. CSDN 编程竞赛二十四期题解

    竞赛总览 CSDN 编程竞赛二十四期:比赛详情 (csdn.net) 本次竞赛感觉打模板的题变少了,而且多了很多可以集思广益的题目,参赛体验很好. 竞赛题解 题目1.计数问题 试计算在区间1到n的所有 ...

  8. 山海演武传·黄道·第一卷 雏龙惊蛰 第二十二 ~ 二十四章 真龙之剑·星墟列将...

    山海演武传·黄道·第一卷 雏龙惊蛰 第二十二 ~ 二十四章 真龙之剑·星墟列将 "我是第一次--请你,请你温柔一点--"少女一边娇喘着,一边将稚嫩的红唇紧贴在男子耳边,樱桃小嘴盈溢 ...

  9. 华为鸿蒙参与者,一起来搞机 篇二十四:不止有鸿蒙,参加华为开发者大会是一种怎样的体验...

    一起来搞机 篇二十四:不止有鸿蒙,参加华为开发者大会是一种怎样的体验 2019-08-19 21:30:00 10点赞 6收藏 4评论 2019年8月9日至11日,HDC.2019华为开发者大会在广东 ...

最新文章

  1. Spring为什么建议构造器注入?
  2. 第十五届全国大学智能汽车提问回答问题 2020-8-9
  3. [InfoPath] 如何配置实现InfoPath的大小类的联动和信息查询?
  4. javascript关于数组合并的——非比寻常
  5. 李迟2022年1月知识总结
  6. 重庆将打造区块链产业高地
  7. opengl双三次bezier曲面_OpenGL复杂物体建模
  8. Bitvise SSH Server超过登录失败次数锁定IP配置
  9. PhotoShop 之钢笔工具
  10. NL驱动表错误导致的性能问题
  11. Elasticsearch笔记
  12. 珍贵的人生格言81条和诸位分享
  13. 360安全卫士造成Sharepoint文档库”使用资源管理器打开“异常
  14. ext4 笔记一(与ext3比较)
  15. R语言使用caret包的confusionMatrix函数计算混淆矩阵、基于混淆矩阵的信息手动编写函数计算accuray、准确率指标
  16. 大一新生 or 职场新人?想买电脑该怎么选?
  17. java 自动论坛评论,Java论坛系统巡云轻论坛
  18. cad布局教程_【CAD布局教程】公装设计CAD施工图深化视频教程(移动设备无广告观看)...
  19. 高分辨率影像卫星之法国
  20. iOS短视频源码音频采集过程中的音效实现 1

热门文章

  1. 请求数据分析 xpath语法 与lxml库
  2. Java基础知识学习01-环境变量的配置、数据类型
  3. 1.15 Python基础知识 - 函数
  4. sql2000 中 存储过程 相关
  5. silverlight中常用公共函数分享
  6. 10.14 ssh:安全地远程登录主机
  7. gj10 python socket编程
  8. Tomcat多实例和负载均衡
  9. oracle隐式转换函数,隐式数据类型转换案例一则
  10. python小案例随机点名_python用tkinter实现一个简易能进行随机点名的界面