網路流24題6 最長遞增子串行

2021-07-25 15:33:57 字數 2400 閱讀 7271

給定正整數序列x1,…,xn 。

(1)計算其最長遞增子串行的長度s。

(2)計算從給定的序列中最多可取出多少個長度為s的遞增子串行。

(3)如果允許在取出的序列中多次使用x1和xn,則從給定序列中最多可取出多少個長度為s的遞增子串行。

設計有效演算法完成(1)(2)(3)提出的計算任務。

第一問秒掉

第二問比較難想到,每個i節點按f[i]不同分了很多層,那麼每次s到t的一條合法路徑都是滿足條件的序列。由於序列中每個點不可重複,需要拆點。邊權是1所以最大流就是增廣路的條數,所以最大流量就是第二問結果

第三問特殊地要求x1和xn可以重複使用,那麼就取消這兩個點相關邊的流量限制,求網路最大流即可。

略坑爹,題目求的不是上公升序列而是不下降序列

如果要求點不能重複使用,那麼拆點是一種可行的方法

洛谷死活不能過,蛋疼

/*

id:wjp13241

prog:

lang:c++

*/#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define fo(i,a,b) for(int i=a;i<=b;i++)

#define dfo(i,a,b) for(int i=a;i>=b;i--)

#define fore(i,x,e) for(int i=ls[x];i;i=e[i].next)

#define fil(x,t) memset(x,t,sizeof(x))

#define filein(s) freopen(s,"r",stdin)

#define fileout(s) freopen(s,"w",stdout)

#define stp system("pause")

#define min(x,y) x#define max(x,y) x>y?x:y

#define mp(x,y) make_pair(x,y)

#define pub(v,x) v.push_back(x)

#define pob(v) v.pop_back()

#define ld long double

#define ll long long

#define db double

#define inf 0x3f3f3f3f

#define lim 100000000

#define eps 1e-4

#define n 10201

#define e n*20+1

#define st 0

#define ed n-1

#define l 21

using

namespace

std;

struct edgee[e];

int num[n], dis[n], cur[n], ls[n], f[n], maxe = 0;

int add(int x, int y, int w);ls[x] = maxe;

e[++maxe] = (edge);ls[y] = maxe;

}int bfs(int st, int ed)}}

}return0;}

int find(int now, int ed, int mn)

for (int &i = cur[now]; i; i = e[i].next)}}

return0;}

int build(int n)}}

}int dinic(int n)

cur[st] = ls[st];

cur[ed] = ls[ed];

mxflow += find(st, ed, inf);

}return mxflow;

}int main()

ans = max(ans, f[i]);}}

cout

<< ans<< endl;

fo(i, 1, n)

if (f[i] == ans)

add(i, i+n, 1);

}build(n);

int mxflow = dinic(n);

cout

<< mxflow <0);

maxe = 0;

fo(i, 1, n)

if (f[i] == ans)

add(i, i+n, v);

}build(n);

mxflow = dinic(n);

cout

<< mxflow 0;}

網路流 24 題 最長遞增子串行

1 dp求一遍 2 所有點拆成入點和出點,對於沒個f i 1的1點連源點,每個f i ans1的點連匯點,每個點的入點和出點再連一條邊,所有容量為1,求一遍最大流。2 1和n可以用多次,所以對於點1和點n,入點和出的連邊的容量變為inf,如果需要連源點或匯點那麼容量也變為n,其餘容量為1,求一遍最大...

網路流24題 最長遞增子串行

輸入檔案 alis.in輸出檔案 alis.out簡單對比 時間限制 1 s 記憶體限制 128 mb 問題描述 給定正整數序列x1,xn。1 計算其最長遞增子串行的長度s。2 計算從給定的序列中最多可取出多少個長度為s的遞增子串行。3 如果允許在取出的序列中多次使用x1和xn,則從給定序列中最多可...

網路流24題 最長遞增子串行

給定正整數序列x1,xn。1 計算其最長遞增子串行的長度s。2 計算從給定的序列中最多可取出多少個長度為s的遞增子串行。3 如果允許在取出的序列中多次使用x1和xn,則從給定序列中最多可取出多少個長度為s的遞增子串行。設計有效演算法完成 1 2 3 提出的計算任務 第1 行有1個正整數n n 500...