O(n²)的suanfa
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<cstring>
using namespace std;
int main()
{
char x[505],y[505];
int sum[505][505],i,j,len1,len2;
while(gets(x))
{
gets(y);
len1=strlen(x);
len2=strlen(y);
memset(sum,0,sizeof(sum));
for(i=1;i<=len1;i++)
{
for(j=1;j<=len2;j++)
{
if(x[i-1]==y[j-1])
sum[i][j]=sum[i-1][j-1]+1;
else
sum[i][j]=max(sum[i-1][j],sum[i][j-1]);
}
}
printf("%d\n",sum[len1][len2]);
}
return 0;
}
O(nlogn)的算法。
![](https://i-blog.csdnimg.cn/blog_migrate/451891f27fecc7df3b0eec0d167ccc6d.png)
感觉楼主说的很对,就直接贴过来了。
#include <iostream>
using namespace std;
int BinSeach(int &item, int *a, int left, int right)
{
while (left<right)
{
int mid = (left + right) / 2;
if (item > a[mid] && item <= a[mid + 1])
return mid;
else if (item < a[mid])
right = mid - 1;
else
left = mid + 1;
}
}
int main()
{
int a[] = { 1, 7, 3, 5, 9, 4, 8 };
int n = sizeof(a) / sizeof(int);
int b[sizeof(a) / sizeof(int)];
b[0] = a[0];
int len = 1;
int j = 0;
for (int i = 1; i < n;i++)
{
if (a[i]>b[len - 1])
j = len++;
else
j = BinSeach(a[i], b, 0, len - 1)+1;
b[j] = a[i];
}
cout << len << endl;
for (int i = 0; i < len;i++)
{
cout << b[i] << " ";
}
return 0;
}
这个是求出最大公共子串的和的点击打开链接
#include <stdio.h>
int N;
int data[1001];
int dp[1001];
int MIS(){
int i, j;
int max;
for (i = 1; i <= N; ++i){
dp[i] = data[i];
for (j = 1; j < i; ++j){
if (data[i] > data[j] && dp[i] < dp[j] + data[i]){
dp[i] = dp[j] + data[i];
}
}
}
max = -1;
for (i = 1; i <= N; ++i){
if (max < dp[i])
max = dp[i];
}
return max;
}
int main(void){
int i;
while (scanf("%d", &N) != EOF){
for (i = 1; i <= N; ++i){
scanf("%d", &data[i]);
}
printf("%d\n", MIS());
}
return 0;
}