子序列(可不连续)
#include<stdio.h>
#include<string.h>
#define N 1010
int f[N][N];
char a[N], b[N];
int n, m;
int max(int a, int b){
return a > b ? a : b;
}
int main(){
scanf("%d%d", &n, &m);
scanf("%s %s", a + 1, b + 1);
for(int i = 1; i <= n; i ++) {
for(int j = 1; j <= m; j ++) {
f[i][j] = fmax(f[i - 1][j], f[i][j - 1]);
if(a[i] == b[j]) {
f[i][j] = fmax(f[i][j], f[i - 1][j - 1] + 1);
}
}
}
printf("%d", f[n][m]);
return 0;
}
若是子数组(连续)
#include<stdio.h>
#include<string.h>
#define N 1010
int f[N][N];
char a[N], b[N];
int n, m;
int max(int a, int b){
return a > b ? a : b;
}
int main(){
scanf("%d%d", &n, &m);
scanf("%s %s", a + 1, b + 1);
int res = 0;
for(int i = 1; i <= n; i ++) {
for(int j = 1; j <= m; j ++) {
// f[i][j] = fmax(f[i - 1][j], f[i][j - 1]);
if(a[i] == b[j]) {
f[i][j] = fmax(f[i][j], f[i - 1][j - 1] + 1);
res = fmax(f[i][j], res);
}
}
}
printf("%d", res);
return 0;
}