定义状态d [ i ] [ j ]表示以a数组的前i个元素,b数组的前j个元素并且以b[j]为结尾的LCIS的长度。
首先:a [ i ] != b[j]时, d[i]
举个例子
a={1, 4, 2, 5, -12} b ={5, -12, 1, 2, 4, 5}
5 | -12 | 1 | 2 | 4 | 5 | |
1 | 0 | 0 | 1 | 0 | 0 | 0 |
4 | 0 | 0 | 1 | 0 | 2 | 0 |
2 | 0 | 0 | 1 | 2 | 2 | 0 |
5 | 1 | 0 | 1 | 2 | 2 | 3 |
-12 | 1 | 1 | 1 | 2 | 2 | 3 |
if(a[i] == b[j])
d[i][j] = mx + 1;
else if(a[i] > b[j] && mx < d[i-1][j])
mx = d[i-1][j];
//只有当a[i] > b[j]时,才更新mx, 保证了所求序列是上升的。
仔细看表格会发现: 若d[i][j] > 0 的话,那么在数组a前i个元素中一定存在a[k]( 1 <= k <= i)等于b[j]. 否则说明前i个a元素中没有与b[j]相同的元素。
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner cin=new Scanner(System.in);
int n=cin.nextInt();
int[] a=new int[n+1];
int[] b=new int[n+1];
int[][] f=new int[n+1][n+1];
for(int i=1;i<=n;i++)
a[i]=cin.nextInt();
for(int i=1;i<=n;i++)
b[i]=cin.nextInt();
int ans=0;
int max;
for(int i=1;i<=n;i++)
{
max=0;
for(int j=1;j<=n;j++)
{
f[i][j]=f[i-1][j];
if(a[i]>b[j]&&f[i-1][j]>max)
max=f[i-1][j];
if(a[i]==b[j])
f[i][j]=max+1;
}
}
for(int j=1;j<=n;j++)
ans=Math.max(ans, f[n][j]);
System.out.println(ans);
}
}