【思路】动态规划
【LIS】
#include<iostream>
#include<cstring>
#include<vector>
#include<math.h>
#include<algorithm>
#include<queue>
using namespace std;
#define maxi 0x3f3f3f3f
int str[100];
int k;
int dp[100];
int LIS()
{
for (int i = 0; i < k; ++i)
{
for(int j=0;j<i;j++)
{
if(str[j]>=str[i])
{
dp[i]=max(dp[i],dp[j]+1);
}
}
/* code */
}
int m=1;
for(int i=0;i<k;i++)
m=max(m,dp[i]);
return m;
}
int main(int argc, char const *argv[])
{
cin>>k;
for(int i=0;i<k;i++)cin>>str[i];
fill(dp,dp+100,1);
cout<<LIS()<<endl;
return 0;
}
【LCS】
dp[i][j]表示s1中前i个字符与s2中前j个字符分别组成的两个前桌字符串的最长公共子串长度。
#include<iostream>
#include<cstring>
#include<vector>
#include<math.h>
#include<algorithm>
#include<queue>
using namespace std;
#define maxi 0x3f3f3f3f
char str1[100];
char str2[100];
int dp[100][100];
int LCS()
{
int l1=strlen(str1);
int l2=strlen(str2);
for(int i=0;i<l1;i++)dp[i][0]=0;
for(int i=0;i<l2;i++)dp[0][i]=0;
for(int i=1;i<=l1;i++)
for (int j= 1; j<=l2; ++j)
{
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]);
}
return dp[l1][l2];
}
int main(int argc, char const *argv[])
{
cin>>str1>>str2;
cout<<LCS()<<endl;
return 0;
}