输入描述:
输入多行,先输入数组的个数,再输入相应个数的整数
输出描述:
输出结果
输入例子:
6 2 5 1 5 4 5
输出例子:
3
提示
Example:
6个点的高度各为 2 5 1 5 4 5
如从第1格开始走,最多为3步, 2 4 5
从第2格开始走,最多只有1步,5
而从第3格开始走最多有3步,1 4 5
从第5格开始走最多有2步,4 5
所以这个结果是3。
//最长递增子序列问题--动态规划问题
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 import java.util.*; 2 public class Test2{ 3 public static void main(String[] args) { 4 Scanner sc = new Scanner(System.in); 5 while(sc.hasNext()) { 6 int n = sc.nextInt(); 7 int[] nums = new int[n]; 8 int[] dp = new int[n]; 9 for(int i=0; i<n; i++) { 10 nums[i] = sc.nextInt(); 11 } 12 dp[0] = 1; 13 int maxdp = 1; 14 for(int i = 1;i<n;i++){ 15 dp[i] = 1; 16 for(int j = 0;j<i;j++){ 17 if(nums[j]<nums[i]&&dp[j]>dp[i]-1) 18 dp[i] = dp[j] + 1; 19 } 20 System.out.println(dp[i]); 21 if(dp[i]>maxdp){ 22 maxdp = dp[i]; 23 } 24 } 25 // for(int i=1; i<n; i++) { 26 // System.out.println(dp[i]); 27 // } 28 // System.out.println(dp[n-1]); 29 System.out.println(maxdp); 30 } 31 } 32 }
// 最长递增子序列:
// 动态规划
// dp[i] = max(dp[j]) + 1;
// 0<j<i&&num[i]>num[j]
主要参考:http://www.cnblogs.com/lonelycatcher/archive/2011/07/28/2119123.html
http://www.cnblogs.com/zhourongqing/archive/2012/04/14/2446601.html
http://my.oschina.net/hengjie/blog/124257
http://www.2cto.com/kf/201405/298201.html
https://www.felix021.com/blog/read.php?1587