給定正整數序列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...