最長上公升子串行模板

2022-04-27 11:27:11 字數 1239 閱讀 6562

1、動態規劃法

#include #define  max 1000  

int seq[max+10];

int seqlen[max+10];

int main()

seqlen[i]=max+1;

if(seqlen[i]>maxlen) //seqlen中儲存的是第i個數為終點的最長上公升序列,找出這個陣列中最大的值即為最優序列長度

maxlen=seqlen[i];

} printf("%d/n",maxlen);

return 0;

}

2、nlog(n)複雜度解法

#include #include#includeusing namespace std;  

#define maxn 50010

typedef long long ll;

ll arr[maxn],ans[maxn],len;

int main()

ans[1]=arr[1];

len=1;

for(i=2;i<=p;i++)

} printf("%lld\n",len);

// }

return 0;

}

3、lcs方法

先將序列從小到大排序,然後用最長公共子串行(lcs)去匹配

下面給出lcs演算法的實現:(複雜度為n^2)

#include#include#includeusing namespace std;  

const int maxn = 1e3 + 10;

char a[maxn],b[maxn],ans[maxn];

int dp[maxn][maxn];

int main()else dp[i][j] = max(dp[i][j-1],dp[i-1][j]);

} }

int cur = 0;

for(int i = n,j = m;dp[i][j];--i,--j)

reverse(ans,ans+cur);

ans[cur] = '\0';

printf("%s\n",ans);

return 0;

}

最長上公升子串行(模板)

include include include include using namespace std int n,q int stack 100100 char s 100100 intdp int start else else stack low s i return top int main...

最長上公升子串行(DP 模板)

有兩個不可描述的線段,每個上面有 n 個介面,現在給定了乙個連線,求如果減去一些連線的話,最大的不交叉連線個數是多少。省賽選拔賽的題,英文題面太長直接沒看。理解題意後挺簡單的,只要找到規律。要求最大的不交叉,可以找到乙個規律,就是求不遞減子串行,不過這裡用 o n 2 的會超時,所以用了乙個 o n...

最長上公升子串行LIS模板

有兩種演算法複雜度為 o n logn 和 o n 2 o n 2 演算法分析如下 a 1 a n 存的都是輸入的數 1 對於a n 來說.由於它是最後乙個數,所以當從a n 開始查詢時,只存在長度為1的上公升子串行 2 若從a n 1 開始查詢.則存在下面的兩種可能性 1 若a n 1 a n 則...