算法第三章

 

单调最长子序列问题

程序如下

import java.util.Scanner;

public class Main {
static int solution(int[] a, int n)
{
int[] d = new int[1000];
for(int i = 0; i < n; i++)
{
if(i == 0) d[i] = 1;
else
{
d[i] = 0;
for(int j = 0; j < i; j++)
if(a[j] < a[i] && d[j] > d[i]-1) d[i] = d[j] + 1;
if(d[i] == 0) d[i] =1;
}
}
int answer = 0;
for(int i = 0; i < n;i++)
if(d[i] > answer) answer = d[i];
return answer;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int[] a = new int[1000];
for(int i = 0; i < n; i++)
a[i] = input.nextInt();
input.close();
System.out.println(solution(a, n));
}

}

1.1 递归方程

              d[i] = 1 ,i == 0

d[i] ==   

     max{0, d[0],d[1],d[2],d[3], .....,d[j], ...... ,d[i-1]} +1, a[i] >a[j]

1.2 

因为记录的是以某一位的数字为结尾的最长子序列,所以维度应为一维

因为最多有n个数,所以填表范围为0~n-1

由递归方程可知填表顺序应该为从左到右

1.3时间复杂度为O(n2);

     空间复杂度为O(n);

2.

对动态规划的理解:

为了防止重复计算子问题,将每一步计算得到的子问题结果记录下来,在下次计算要用到时可以直接使用,以减少计算次数和时间开销,提高算法效率

3.

编程情况:

一开始还并没有想到如何用动态规划解决,尤其是备忘录是记录以某一位数字为结尾的最长子序列比较难想到,我是在参考了其他人的程序才想到怎么做的。

 

posted @ 2020-11-01 00:51  zhang’  阅读(59)  评论(0编辑  收藏  举报