LIS(最长上升子序列)
#include <iostream>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<deque>
#include<queue>
#include<vector>
#include<stack>
#include<ctime>
using namespace std;
#define eps 1e-10
#define INF 0x3f3f3f3f
typedef long long LL;
LL dp[40100],a[40100];
int main()
{
int T;
cin>>T;
while(T--)
{
memset(dp,0,sizeof(dp));
int n,m=1;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
dp[1]=a[1];
for(int i=2;i<=n;i++)
{
if(a[i]>dp[m])
dp[++m]=a[i];
else
{
int ans=lower_bound(dp,dp+m,a[i])-dp;
dp[ans]=a[i];
}
}
cout<<m<<endl;
}
}
LCS(最大公共子序列)
只求序列长度;
#include <iostream>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<deque>
#include<queue>
#include<vector>
#include<stack>
#include<ctime>
using namespace std;
#define eps 1e-10
#define INF 0x3f3f3f3f
typedef long long LL;
int dp[1005][1005];
string str1,str2;
void LCS(int n,int m)
{
for(int i=1; i<n+1; i++)
for(int j=1; j<m+1; j++)
{
if(i==0||j==0)
dp[i][j]=0;
else
{
if(str1[i-1]==str2[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
int main()
{
while(cin>>str1>>str2)
{
memset(dp,0,sizeof(dp));
dp[0][0]=0;
int n=str1.size(),m=str2.size();
LCS(n,m);
cout<<dp[n][m]<<endl;
//cout<<str1<<endl<<str2;
}
}
输出任意一种子序列:
#include <iostream>
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<deque>
#include<queue>
#include<vector>
#include<stack>
#include<ctime>
using namespace std;
#define eps 1e-10
#define INF 0x3f3f3f3f
typedef long long LL;
int dp[1005][1005];
string str1,str2;
void LCS(int n,int m)
{
for(int i=1; i<n+1; i++)
for(int j=1; j<m+1; j++)
{
if(i==0||j==0)
dp[i][j]=0;
else
{
if(str1[i-1]==str2[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
int main()
{
while(cin>>str1>>str2)
{
memset(dp,0,sizeof(dp));
dp[0][0]=0;
int n=str1.size(),m=str2.size();
LCS(n,m);
stack<char>p;
int i=n,j=m;
while(i!=0&&j!=0)
{
if(str1[i-1]==str2[j-1])
{
p.push(str1[i-1]);
i--;
j--;
}
else
{
if(dp[i-1][j]>dp[i][j-1])
i--;
else
j--;
}
}
while(!p.empty())
cout<<p.top(),
p.pop();
cout<<endl;
}
}
最好不要用递归可能会T