最長遞增子串行

2021-08-13 02:39:53 字數 1722 閱讀 9817

給定正整數序列 x1∼xn,以下遞增子串行均為非嚴格遞增。

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

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

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

開心~這題想了一下一遍很輕鬆的a了。第乙個問題,最長不上公升子串行 普及組難度的dp應該不用講吧?

第二個問題,取出就不能用了。每個數只能用一次。我們想到航空路線問題的不相交路徑,對於每個數我們都可以對他可以達到的遞增的數連一條容量為1的邊。然後問題來了。我們發現這樣並沒有辦法做。。因為他們取數是有先後順序的。

然後我靈光一現,想到了星際轉移的分層圖。然後就這樣寫辣。對於每個點拆成s個點。然後分層圖。

在每一層中都連容量1的邊。這就是乙個星際轉移+航空路線了。

對於第三問,只要把2條邊容量限制取消就好了。

寫完以後,我看了下題解。。發現和我的方法並不一樣啊。。妙妙。

我先發我的方法,到時候研究一下題解。(byvoid)

#include

using

namespace

std;

const

int maxn=1e5+5;

const

int inf=1e9;

struct edgee[maxn<<1],e2[maxn<<1];

int n,m,s,t;

int head[maxn],cur[maxn],a[1000],f[1000],cnt=1;

inline

void add(int u,int v,int w),head[u]=cnt;

e[++cnt]=(edge),head[v]=cnt;

}int head2[maxn],cur2[maxn],cnt2=1;

inline

void add2(int u,int v,int w),head2[u]=cnt2;

e2[++cnt2]=(edge),head2[v]=cnt2;

}queue

q;int dep[maxn];

bool bfs(int x)}}

if(!dep[t])return

0; return

1; }

int dfs(int u,int flow)}}

return0;}

int dinic()

return ans;

}bool bfs2(int x)}}

if(!dep[t])return

0; return

1; }

int dfs2(int u,int flow)}}

return0;}

int dinic2()

return ans;

}int main()

for(int i=n;i>=1;i--)

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

}s=0,t=n*ans+1;

for(int i=1;ifor(int j=i+1;j<=n;j++)}}

}for(int i=1;i<=n;i++)

for(int i=n*(ans-1)+1;i<=n*ans;i++)

printf("%d\n%d\n%d\n",ans,dinic(),dinic2());

return

0;}

最長遞增子串行

這是微軟實習生筆試遇到的,題意 求乙個陣列中最長遞增子串行的長度。要求選擇該題最好演算法的時間複雜度和空間複雜度。答案 時間複雜度o nlgn 空間複雜度o n 這題明顯用動態規劃來解。假設在目標陣列array 的前i個元素中,以array i 元素為最大元素的遞增子串行的長度是lis i 那麼 遞...

最長遞增子串行

最長遞增子串行又叫做最長上公升子串行 子串行,正如lcs一樣,元素不一定要求連續。本節討論實現三種常見方法,主要是練手。題 求乙個一維陣列arr i 中的最長遞增子串行的長度,如在序列1,1,2,3,4,5,6,7中,最長遞增子串行長度為4,可以是1,2,4,6,也可以是 1,2,4,6。方法一 d...

最長遞增子串行

最長遞增子串行 求乙個字串的最長遞增子串行 如 dabdbf最長遞增子串行就是abdf,長度為4 這是一道基本的動態規劃求解的題目,與此類似的還有 最長公共子串行 分析 用一維陣列dp i 來儲存以a i 為末元素的最長遞增子串行的長度,那麼dp i 至少為1 即包含它本身 往前尋找,如果存在a j...