题目描述

«问题描述:

给定正整数序列x1,...,xn 。

(1)计算其最长不下降子序列的长度s。

(2)计算从给定的序列中最多可取出多少个长度为s的不下降子序列。

(3)如果允许在取出的序列中多次使用x1和xn,则从给定序列中最多可取出多少个长度为s的不下降子序列。

«编程任务:

设计有效算法完成(1)(2)(3)提出的计算任务。

输入格式

第1 行有1个正整数n,表示给定序列的长度。接下来的1 行有n个正整数n:x1, ..., xn。

输出格式

第1 行是最长不下降子序列的长度s。第2行是可取出的长度为s 的不下降子序列个数。第3行是允许在取出的序列中多次使用x1和xn时可取出的长度为s 的不下降子序列个数。

输入输出样例

输入 #1
4

3 6 2 5

输出 #1
2

2
3

说明/提示

n≤500


【解题思路】

  运用最小割解决问题的本质是

找到多个问题同时存在且矛盾的情况,利用网络流找到最优的解

于是这个问题的解决方式就能够这样解决

首先,拆点,一个入点一个出点,考虑他们的连接过程

因为源头流量为 1 ,于是就能够形成单一的链,保证情况独立,能够排除矛盾情况

开头的是长度为 1 的,因为最长的能够包括所有子串,所以连接至汇点

然后对每个符合要求,对这道题来说就是

能够顺利组成增加一个字符串,使这个子串增长

如果选择了这个子串之后,就能够或者这个子串相应的流量

在最大流的性质和思想下最终也就能够得到最终答案了


【代码】

#include<cstdio>
#include<queue>
#include<cstring>
#define ll int
using namespace std;
const int MAXN = 5010;
const int MAXM = 200010;
const ll  INF = (1ll << 31) - 1;
struct note
{int to;int nt;int rev;ll cal;
};
struct edge
{note arr[MAXM];int siz;int maxn;int a[MAXN];int dp[MAXN];int  st[MAXN];int  dis[MAXN];int  cur[MAXN];int  depth[MAXN];int  top;int n, m, s, t;edge(){memset(st, -1, sizeof(st));memset(depth, -1, sizeof(depth));memset(dis, -1, sizeof(dis));top = 0;}void read(){scanf("%d", &n);for (int i = 1; i <= n; i++)scanf("%d", &a[i]);}int LIS(){for (int i = 1; i <= n; i++)dp[i] = 1;for (int i = 1; i <= n; i++)for (int j = 1; j < i; j++){if (a[j] <= a[i]){dp[i] = max(dp[i], dp[j] + 1);}}maxn = -1;for (int i = 1; i <= n; i++)if (maxn < dp[i])maxn = dp[i];return maxn;}void build(){t = 2*n+2;for (int i = 1; i <= n; i++){add(i, i + n, 1);if(dp[i]==1)add(0, i, 1);if (dp[i] == maxn)add(i + n, t, 1);}for (int i = 1; i <= n; i++)for (int j = 1; j <i; j++)if (a[j] <= a[i] && dp[j] + 1 == dp[i])add(j+n, i , 1);s = 0;siz = 2 * n+1;}bool dep(){queue<int> q;q.push(s);memset(depth, -1, sizeof(depth));depth[s] = 0;while (!q.empty()){int v = q.front(); q.pop();for (int i = st[v]; i != -1; i = arr[i].nt){int to = arr[i].to;if (!arr[i].cal)continue;if (depth[to] != -1)continue;depth[to] = depth[v] + 1;q.push(to);}}return (depth[t] != -1);}void add(int x, int y, ll z){top++; arr[top] = { y,st[x],top + 1,z }; st[x] = top;top++; arr[top] = { x,st[y],top - 1,0 }; st[y] = top;}ll dfs(int now, ll val){if (now == t || !val)return val;ll flow = 0;for (int& i = cur[now]; i != -1; i = arr[i].nt){int to = arr[i].to;if (depth[to] != depth[now] + 1)continue;ll f = dfs(to, min(arr[i].cal, val));if (!f || !arr[i].cal)continue;flow += f;arr[i].cal -= f;arr[arr[i].rev].cal += f;val -= f;if (!val)return flow;}return flow;}ll dinic(){ll flow = 0;ll f;while (dep()){for (int i = 0; i <= siz; i++)cur[i] = st[i];while (f = dfs(s, INF))flow += f;}return flow;}
};
edge road,tmp;
int main()
{road.read();//printf("**\n");printf("%d\n",road.LIS());//printf("**\n");//printf("\n");
    road.build();//printf("**\n");tmp = road;printf("%d\n", tmp.dinic());if(road.dp[1]==1)road.add(road.s, 1, INF);if(road.dp[road.n]==road.maxn)road.add(road.n * 2, road.t, INF);road.add(1, road.n + 1, INF);road.add(road.n, road.n * 2, INF);printf("%d", road.dinic());return 0;
}

View Code

转载于:https://www.cnblogs.com/rentu/p/11323873.html

【P2766】 最长不下降子序列问题相关推荐

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  9. 中石油训练赛 - Racing Gems(最长不下降子序列)

    题目描述 You  are  playing  a  racing  game.  Your  character  starts  at  the  X-axis  line  (y=0)  and ...

最新文章

  1. nginx的gzip压缩功能
  2. springboot~Compiler时开启插件的注解功能
  3. 利用requests库访问网站
  4. [bzoj3143] [HNOI2013]游走
  5. java怎么输出集合_Java 输出集合中的元素
  6. 在openstack环境中安装rackspace private cloud --1 环境准备
  7. php cdi_使用CDI的InjectionPoint注入配置值
  8. Spring Cloud构建微服务架构:分布式配置中心【Dalston版】
  9. Use JPA API
  10. 【Elasticsearch】如何在 Elasticsearch 中轻松编写脚本
  11. TuxOnIce! 休眠到硬盘[zt]
  12. apple 官网系统软件下载如Command Line Tools下载
  13. Refused to execute script from 'http://localhost:8080/login' because its MIME type ('text/html') is
  14. 可牛影像动感渐隐闪图教程
  15. mysql 短文本相似度_短文本相似度比较
  16. WPS-Word中换行符、回车符删除不掉怎么办?某一个空行删不掉
  17. mysql哨兵模式_redis 哨兵模式集群搭建
  18. 如果爱忘了那就让一切随风去吧
  19. vue商城:商品规格数据处理
  20. 【面试题】【C语言】5位运动员参加跳水比赛,有人让他们预测比赛结果

热门文章

  1. 并发编程(一)__volatile关键字
  2. Linux下添加PATH环境变量
  3. [转载] 七龙珠第一部——第095话 悟空对抗克林
  4. seo策略从5方面下手
  5. 遭遇ORA-01200错误的原因及解决方法
  6. WCF 第四章 绑定 绑定元素
  7. Windows Server 2003 R2中的“分布式文件系统”案例应用
  8. ActiveX组件及其注册 (轉)
  9. LAMP服务搭建详解
  10. 笔记:面试 - Vue