P1071 LCIS 最长公共上升子序列

来源:互联网 发布:18u网络机柜 编辑:程序博客网 时间:2024/05/16 10:36

定义状态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  0010004   00102020012205101223-12111223

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);}}


0 0