求最長公共子串行有幾種方法
#include
#include
using namespace std;
#include
#include
const int inf=0x3f3f3f3f;
const int maxn=10005;
int a[maxn];
ints[maxn];
int dp[maxn];
int dpx[2][maxn];
int p[maxn];
int n,m;
int finds(int
x) returns;}
int main()
memset(dp,inf,sizeof(dp));
memset(p,inf,sizeof(p));
m=0;
//最長遞增子串行求法 1 普通實現,dp
/*for(int i=0;iif(a[i]>dp[m])
else}}
printf("length=%d\n",m+1);
for(int i=0;iif(p[i]==inf)break;
else
printf("%d ",p[i]);
}cout<*/
//最長遞增子串行求法 2 利用stl,**量十分少,效率也不低
/*memset(dp,inf,sizeof(dp));
m=0;
for(int i=0;iint
pos=lower_bound(dp,dp+n,a[i])-dp;
dp[pos]=a[i];
}printf("length=%d\n",lower_bound(dp,dp+n,inf)-dp);
*///最長遞增子串行求法 3 和排序後的陣列求最長公共子串行,效率不高,但是也是一種方法啊
for(int i=1;i<=n;i++)
memcpy(s+1,a+1,sizeof(int)*n);
memset(dpx,0,sizeof(dpx));
sort(s+1,s+n+1);
/*for(int i=1;i<=n;i++)
else}}
}int ans=0;
for(int i=0;i<=n;i++)
cout0;}
最長公共子串行 最長上公升子串行 最長公共上公升子串行
核心 for int i 1 ifor int j 1 jif a i b j else hdu5248 樹狀陣列優化 nl ogn nlo gn include using namespace std const int maxn 100005 char a maxn int len int bi...
最長公共上公升子串行
題目描述 給定兩個整數序列,求它們的最長上公升公共子串行。輸入描述 輸入兩組資料,每組資料代表乙個整數序列,其輸入格式為 第一行輸入長度m 1 m 500 第二行輸入該序列的m個整數ai 231 ai 231 輸出描述 輸出共兩行。第一行輸出兩個序列的最長上公升公共子串行的長度l 第二行輸出該子串行...
最長公共上公升子串行
首先,在 a i b j 的時候有 dp i j dp i 1 j 為什麼呢?因為 dp i j 是以b j 為結尾的 lcia 如果dp i j 0 那麼就說明 a 1 a i 中必然有乙個字元 a k 等於b j 如果dp i j 等於0 呢?那賦值與否都沒有什麼影響了 因為 a k a i 那...