算法分析
优化:
由于状态转移时每次需要用到前缀的信息计算出来的信息(最大值),因此在枚举a[]
数组每个元素时,用maxv
记录当前a[i] > 所有b[k]
时,f[k] + 1
的最大值,其中k < j
,可以降到二维的复杂度
不得不说,y总的分析方法tql
时间复杂度 $O(n^3)$
参考文献
算法提高课
Java 代码1
import java.util.Scanner;
public class Main {
static int N = 3010;
static int[] a = new int[N];
static int[] b = new int[N];
static int[][] f = new int[N][N];
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
for(int i = 1;i <= n;i ++) a[i] = scan.nextInt();
for(int i = 1;i <= n;i ++) b[i] = scan.nextInt();
for(int i = 1;i <= n;i ++)
{
for(int j = 1;j <= n;j ++)
{
f[i][j] = f[i - 1][j];
if(a[i] == b[j])
{
f[i][j] = 1;//初始为1
for(int k = 1;k < j;k ++)
{
if(b[k] < b[j]) f[i][j] = Math.max(f[i][j], f[i - 1][k] + 1);
}
}
}
}
//需要类似最长上升子序列求得最大值,也可以直接加到上面的循环中
int res = 0;
for(int i = 1;i <= n;i ++) res = Math.max(res,f[n][i]);
System.out.println(res);
}
}
时间复杂度 $O(n^2)$
参考文献
算法提高课
Java 代码2
import java.util.Scanner;
public class Main {
static int N = 3010;
static int[] a = new int[N];
static int[] b = new int[N];
static int[][] f = new int[N][N];
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int n = scan.nextInt();
for(int i = 1;i <= n;i ++) a[i] = scan.nextInt();
for(int i = 1;i <= n;i ++) b[i] = scan.nextInt();
for(int i = 1;i <= n;i ++)
{
int maxv = 1;//记录当前a[i] > 所有b[k]时,f[k] + 1的最大值,其中k < j
for(int j = 1;j <= n;j ++)
{
f[i][j] = f[i - 1][j];
if(a[i] == b[j]) f[i][j] = maxv;
if(b[j] < a[i]) maxv = Math.max(maxv, f[i][j] + 1);
}
}
//需要类似最长上升子序列求得最大值,也可以直接加到上面的循环中
int res = 0;
for(int i = 1;i <= n;i ++) res = Math.max(res,f[n][i]);
System.out.println(res);
}
}
%%
%%%
楼楼tql
qwq,搬砖的hhh
能请问一下为什么包含a[i] 就会有a[i] == b[j]的性质吗? a[i]匹配1~j - 1中的一个数有没有可能?
问题一:由于
b[j]
是一定要有的,如果a[i] != b[j]
,直接就是右边的情况的问题二:有可能匹配
1
到j-1
的某个数,可是现在状态是f[i, j]
只要找到转移到该状态的其他状态即可,若a[i]
匹配的是其他的,会在f[i][k]
的时候讨论到(其中1 <= k <= j - 1
),这里的状态表示b[j]
是一定会有的谢谢巨佬
经典闫氏dp法
qwq
b[k]<b[j]和b[j]<a[i]没看懂,求大佬指点
第一个
b[k] < b[j]
类似最长上升子序列的想法,表示b[k]
下一步能跳到b[j]
,因此当前状态可以由b[k]
的状态转移过来,第二个maxv
记录当前a[i] > 所有b[k]
时,f[k] + 1
的最大值,因此如果当前的b[j]
也是符合这个要求,则需要更新maxv
理解了,感谢