http://acm.fafu.edu.cn/problem.php?id=1136 根据dp建边,建边的时候记得判断如果原本数的大小就ok了 好久没在自家OJ上刷了

#include <iostream>
#include<string.h>
#include<cstdio>
#include<queue>
#include<vector>
//称这个机会吧EK 和DINIC都写一遍复习一下;
using namespace std;
int dp[1105],a[1105],n,max_val,NUM;
int map[1105][1105],flow[1105][1105];
int first[1105],next[1000000],v[1000000];
int dist[1105];
void add(int a,int b)
{
v[NUM]=b;next[NUM]=first[a];first[a]=NUM;NUM++;v[NUM]=a;next[NUM]=first[b];first[b]=NUM;NUM++;
}
void dpw()
{
max_val=0;
int i,j;
for(i=1;i<=n;i++)
{
dp[i]=1;
for(j=1;j<i;j++)
if(a[j]<=a[i]&&dp[i]<dp[j]+1)
dp[i]=dp[j]+1; if(dp[i]>max_val)
max_val=dp[i];
}
}
void build()
{
int i,j;
for(i=1;i<=n;i++)
{
add(i,i+n+1);
map[i][i+n+1]=1;
if(dp[i]==1)
{
map[0][i]=1;
add(0,i);
}
if(dp[i]==max_val)
{
map[i+n+1][n+1]=1;
add(i+n+1,n+1); }else
{
for(j=i+1;j<=n;j++)
if(dp[j]==dp[i]+1&&a[i]<=a[j])
{
add(i+1+n,j);
map[i+n+1][j]=1;
}
}
}
}
bool BFS()
{
memset(dist,-1,sizeof(dist));
queue<int>q;
q.push(0);
int i,x,vv;
dist[0]=0;
while(!q.empty())
{
x=q.front();
q.pop();
for(i=first[x];i!=-1;i=next[i])
{
vv=v[i];
if(dist[vv]==-1&&map[x][vv]>flow[x][vv])
{
dist[vv]=dist[x]+1;
q.push(vv);
}
}
}
if(dist[n+1]==-1)return false;
return true;
}
int min_val(int a,int b){return a>b?b:a;}
int find(int x,int low)
{
int i,a=0,vv;
if(x==n+1)return low;
for(i=first[x];i!=-1;i=next[i])
{
vv=v[i];
if(map[x][vv]>flow[x][vv]&&(dist[x]+1==dist[vv])&&(a=find(vv,min_val(low,map[x][vv]-flow[x][vv]))))
{
flow[x][vv]+=a;
flow[vv][x]-=a;
return a;
}
}
return 0;
}
int main()
{
int i,temp,ans1,ans2; while(scanf("%d",&n)==1){ for(i=1;i<=n;i++)
scanf("%d",&a[i]);
if(n==1){
printf("1\n1\n1\n"); }else {
NUM=0;
memset(first,-1,sizeof(first));
memset(map,0,sizeof(map));
memset(flow,0,sizeof(flow)); dpw();
build();
ans1=ans2=0;
while(BFS())
{
while((temp=find(0,1<<30)))ans1=ans1+temp;
}
map[0][1]=10000000;
map[1][n+1+1]=10000000;
map[n][n+1+n]=10000000;
if(map[n+1+n][n+1]) map[n+1+n][n+1]=10000000;
memset(flow,0,sizeof(flow));
while(BFS())
{
while((temp=find(0,1<<30)))ans2=ans2+temp;
}
printf("%d\n%d\n%d\n",max_val,ans1,ans2);
}
}
return 0;
}

FAFU 1136 最长递增子序列的更多相关文章

  1. (转载)最长递增子序列 O(NlogN)算法

    原博文:传送门 最长递增子序列(Longest Increasing Subsequence) 下面我们简记为 LIS. 定义d[k]:长度为k的上升子序列的最末元素,若有多个长度为k的上升子序列,则 ...

  2. 最长公共子序列(LCS)和最长递增子序列(LIS)的求解

    一.最长公共子序列 经典的动态规划问题,大概的陈述如下: 给定两个序列a1,a2,a3,a4,a5,a6......和b1,b2,b3,b4,b5,b6.......,要求这样的序列使得c同时是这两个 ...

  3. 最长递增子序列 O(NlogN)算法

    转自:点击打开链接 最长递增子序列,Longest Increasing Subsequence 下面我们简记为 LIS. 排序+LCS算法 以及 DP算法就忽略了,这两个太容易理解了. 假设存在一个 ...

  4. 51nod 1134 最长递增子序列

    题目链接:51nod 1134 最长递增子序列 #include<cstdio> #include<cstring> #include<algorithm> usi ...

  5. 动态规划 - 最长递增子序列(LIS)

    最长递增子序列是动态规划中经典的问题,详细如下: 在一个已知的序列{a1,a2,...,an}中,取出若干数组组成新的序列{ai1,ai2,...,aim},其中下标i1,i2,...,im保持递增, ...

  6. 最长递增子序列问题 nyoj 17单调递增最长子序列 nyoj 79拦截导弹

    一,    最长递增子序列问题的描述 设L=<a1,a2,…,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,…,akm>,其中k1< ...

  7. 2.16 最长递增子序列 LIS

    [本文链接] http://www.cnblogs.com/hellogiser/p/dp-of-LIS.html [分析] 思路一:设序列为A,对序列进行排序后得到B,那么A的最长递增子序列LIS就 ...

  8. 【动态规划】拦截导弹_dilworth定理_最长递增子序列

    问题 K: [动态规划]拦截导弹 时间限制: 1 Sec  内存限制: 256 MB提交: 39  解决: 10[提交][状态][讨论版] 题目描述 张琪曼:“老师,修罗场是什么?” 墨老师:“修罗是 ...

  9. COGS731 [网络流24题] 最长递增子序列(最大流)

    给定正整数序列x1,..., xn (n<=500).(1)计算其最长递增子序列的长度s.(2)计算从给定的序列中最多可取出多少个长度为s的递增子序列.(3)如果允许在取出的序列中多次使用x1和 ...

随机推荐

  1. 如何使用HttpClient来发送带客户端证书的请求,以及如何忽略掉对服务器端证书的校验

    最近要做客户端和服务器端的双向认证,在客户端向服务器端发送带证书的请求这里有一点问题,网上的例子大多都不太好使,于是找了github上httpclient源代码中的例子改造了一下,终于弄明白了 git ...

  2. C语言assert()函数用法总结

    assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include <assert.h> void assert( i ...

  3. Nexus网页直接上传jar包

    登陆已经安装好的nexus私有仓库,如图:   点击左边菜单“Repositories”,选择右边列表“3rd party“   点击“3rd party”,选择artifact Upload,如下图 ...

  4. Unity3D笔记十六 输入输出-键盘事件、鼠标事件

    输入与控制操作Unity为开发者提供了Input类库,其中包括键盘事件.鼠标事件和触摸事件等一切跨平台所需要的控制事件. 一.键盘事件 1.按下事件 Input.GetKeyDown():如果按键被按 ...

  5. HTML5是什么?如何鉴定HTML5产品?[转]

    转自:http://www.jscode.cn/web/v62484 Html 5开始大热标志性的事件是Apple 前CEO Steve Jobs 公开炮轰Flash,并指出Flash在移动终端的不利 ...

  6. FZU2110 Star【计算几何】

    Overpower often go to the playground with classmates. They play and chat on the playground. One day, ...

  7. HDU 6278 - Just h-index - [莫队算法+树状数组+二分][2018JSCPC江苏省赛C题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6278 Time Limit: 6000/3000 MS (Java/Others) Memory Li ...

  8. Django运算符表达式

    在html页面中,加入运算符表达式,进行逻辑判断.可参考手册.我用的Django是2.1版本 view.py中的代码: from django.shortcuts import render from ...

  9. 缓存服务,还未创建完缓存时, 需要更改图层名称、服务名称、数据源位置、mxd名称等

    缓存服务,还未创建完缓存时, 需要更改图层名称.服务名称.数据源位置.mxd名称等.已经创建好的缓存还可以再用吗? 测试后可以, 注意:新服务相对旧服务,符号样式没有改变,切片方案没有变化. 测试步骤 ...

  10. 使用schemasync同步数据库表结构

    安装方式 wget http://www.schemasync.org/downloads/SchemaSync-0.9.4.tar.gz tar -xf SchemaSync-0.9.4.tar.g ...