FAFU 1136 最长递增子序列
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 最长递增子序列的更多相关文章
- (转载)最长递增子序列 O(NlogN)算法
原博文:传送门 最长递增子序列(Longest Increasing Subsequence) 下面我们简记为 LIS. 定义d[k]:长度为k的上升子序列的最末元素,若有多个长度为k的上升子序列,则 ...
- 最长公共子序列(LCS)和最长递增子序列(LIS)的求解
一.最长公共子序列 经典的动态规划问题,大概的陈述如下: 给定两个序列a1,a2,a3,a4,a5,a6......和b1,b2,b3,b4,b5,b6.......,要求这样的序列使得c同时是这两个 ...
- 最长递增子序列 O(NlogN)算法
转自:点击打开链接 最长递增子序列,Longest Increasing Subsequence 下面我们简记为 LIS. 排序+LCS算法 以及 DP算法就忽略了,这两个太容易理解了. 假设存在一个 ...
- 51nod 1134 最长递增子序列
题目链接:51nod 1134 最长递增子序列 #include<cstdio> #include<cstring> #include<algorithm> usi ...
- 动态规划 - 最长递增子序列(LIS)
最长递增子序列是动态规划中经典的问题,详细如下: 在一个已知的序列{a1,a2,...,an}中,取出若干数组组成新的序列{ai1,ai2,...,aim},其中下标i1,i2,...,im保持递增, ...
- 最长递增子序列问题 nyoj 17单调递增最长子序列 nyoj 79拦截导弹
一, 最长递增子序列问题的描述 设L=<a1,a2,…,an>是n个不同的实数的序列,L的递增子序列是这样一个子序列Lin=<aK1,ak2,…,akm>,其中k1< ...
- 2.16 最长递增子序列 LIS
[本文链接] http://www.cnblogs.com/hellogiser/p/dp-of-LIS.html [分析] 思路一:设序列为A,对序列进行排序后得到B,那么A的最长递增子序列LIS就 ...
- 【动态规划】拦截导弹_dilworth定理_最长递增子序列
问题 K: [动态规划]拦截导弹 时间限制: 1 Sec 内存限制: 256 MB提交: 39 解决: 10[提交][状态][讨论版] 题目描述 张琪曼:“老师,修罗场是什么?” 墨老师:“修罗是 ...
- COGS731 [网络流24题] 最长递增子序列(最大流)
给定正整数序列x1,..., xn (n<=500).(1)计算其最长递增子序列的长度s.(2)计算从给定的序列中最多可取出多少个长度为s的递增子序列.(3)如果允许在取出的序列中多次使用x1和 ...
随机推荐
- stopImmediatePropagation和stopPropagation (事件、防止侦听)
参考: ActionScript 3.0 Step By Step系列(六):学对象事件模型,从点击按扭开始 actionscript宝典 一.事件模型 egret中的事件模型和flash是一样的,但 ...
- 23种设计模式之装饰模式(Decorator)
装饰模式是一种对象结构型模式,可动态地给一个对象增加一些额外的职责,就增加对象功能来说,装饰模式比生成子类实现更为灵活.通过装饰模式,可以在不影响其他对象的情况下,以动态.透明的方式给单个对象添加职责 ...
- 仿QQ、微信翻页查看聊天记录
主界面MainActivity.class public class MainActivity extends Activity implements OnScrollListener{ privat ...
- express运行原理
一.express底层:http模块 Express框架建立在node.js内置的http模块上.http模块生成服务器的原始代码如下. var http = require("http&q ...
- iOS - 开源框架、项目和学习资料汇总(UI篇)
上下拉刷新控件 1. MJRefresh --仅需一行代码就可以为UITableView或者CollectionView加上下拉刷新或者上拉刷新功能.可以自定义上下拉刷新的文字说明.(推荐)2. SV ...
- easyui treegrid idField 所在属性中值有花括号(如Guid)当有鼠标事件时会报错,行记录一下
easyui treegrid idField 所在属性中值有花括号(如Guid)当有鼠标事件时会报错,行记录一下
- POJ-2356 Find a multiple(DFS,抽屉原理)
Find a multiple Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7133 Accepted: 3122 Speci ...
- 洛谷P2414 阿狸的打字机【AC自动机】【fail树】【dfs序】【树状数组】
居然真的遇上了这种蔡队题.瑟瑟发抖. 题目背景 阿狸喜欢收藏各种稀奇古怪的东西,最近他淘到一台老式的打字机. 题目描述 打字机上只有28个按键,分别印有26个小写英文字母和'B'.'P'两个字母.经阿 ...
- matlab中norm函数的用法
格式:n=norm(A,p) 功能:norm函数可计算几种不同类型的矩阵范数,根据p的不同可得到不同的范数 以下是Matlab中help norm 的解释 NORM Matrix or vecto ...
- UVA - 11624 Fire! bfs 地图与人一步一步先后搜/搜一次打表好了再搜一次
UVA - 11624 题意:joe在一个迷宫里,迷宫的一些部分着火了,火势会向周围四个方向蔓延,joe可以向四个方向移动.火与人的速度都是1格/1秒,问j能否逃出迷宫,若能输出最小时间. 题解:先考 ...