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