dp求最长递增子序列并输出

 1 import java.util.ArrayList;
 2 import java.util.Arrays;
 3 import java.util.List;
 4
 5 /**
 6  * Created  on 2016/4/26.
 7  */
 8 public class Testdp {
 9
10     public static void main(String[] args) {
11         new Testdp().getLIS();
12     }
13
14     public void getLIS() {
15         List<Integer> nums = null;
16         Integer[] numArray = {1, 4, 8, 1, 2, 3, 5};
17         nums = Arrays.asList(numArray); //输入的数据
18         int len = nums.size();
19
20         String[] result = new String[len]; // 用来存储输出字符串
21         int dp[] = new int[len];
22
23         for (int i = 0; i < len; ++i) {
24             dp[i] = 1;
25             result[i] = "" + nums.get(i);
26
27             for(int j=0; j<i; ++j) {
28                 if (nums.get(j) < nums.get(i) && dp[j] + 1 > dp[i]) {
29                     result[i] = result[j] + " " +  nums.get(i);
30                     dp[i] = dp[j] + 1;
31                 }
32             }
33         }
34
35         int maxLen = 0;
36         int maxIndex = 0;
37         for(int i=0; i<len; ++i) {
38             if (maxLen < dp[i]) {
39                 maxLen = dp[i];
40                 maxIndex = i;
41             }
42         }
43         System.out.println(result[maxIndex]);
44         System.out.println(maxLen);
45
46     }
47
48 }
时间: 2024-11-13 11:33:43

dp求最长递增子序列并输出的相关文章

hrbust/哈理工oj 1334 最好的心情【求最长递增子序列&amp;&amp;最大值】

最好的心情 Time Limit: 1000 MS Memory Limit: 65536 K Total Submit: 200(44 users) Total Accepted: 55(38 users) Rating: Special Judge: No Description 俗话说"月有阴晴圆缺,人有悲欢离合.". 虽然大家都没这么悲催,但是心情的波动在所难免. MM的心情也会有波动,心情好心情值就高,心情不好心情值就低,每个小时都不一样,GG想知道MM最长的上升心情值的子序

(hdu step 3.2.2)Common Subsequence(简单dp:求最长公共子序列的长度)

在写题解之前给自己打一下广告哈~..抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下: http://edu.csdn.net/course/detail/209 题目: Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 976 Accepted Submission(s): 538   Probl

动态规划(DP),最长递增子序列(LIS)

题目链接:http://poj.org/problem?id=2533 解题报告: 状态转移方程: dp[i]表示以a[i]为结尾的LIS长度 状态转移方程: dp[0]=1; dp[i]=max(dp[k])+1,(k<i),(a[k]<a[i]) #include <stdio.h> #define MAX 1005 int a[MAX];///存数据 int dp[MAX];///dp[i]表示以a[i]为结尾的最长递增子序列(LIS)的长度 int main() { int

(hdu step 3.2.3)Super Jumping! Jumping! Jumping!(DP:求最长上升子序列的最大和)

在写题解之前给自己打一下广告哈~..抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下: http://edu.csdn.net/course/detail/209 题目: Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 896 Accepted Submission(s

最长递增子序列(输出最长递增序列 及其长度)

最长递增子序列的解法有很多种,常用的有最长公共子序列法.动态规划.记录所有递增序列长度最大值的方法. 最长公共子序列法:如例子中的数组A{5,6, 7, 1, 2, 8},则我们排序该数组得到数组A‘{1, 2, 5, 6, 7, 8},然后找出数组A和A’的最长公共子序列即可.显然这里最长公共子序列为{5, 6, 7, 8},也就是原数组A最长递增子序列. 在http://blog.csdn.net/yysdsyl/article/details/4226630中有详细解释. 动态规划:参见h

hdu 1025 dp+二分求最长递增子序列

//dp[i],长度为i的递增子序列的最后一位的最小值 //对于这种处理得到的dp[i]必然是递增的 //对于第i个数a[i],只需要找到最小的大于它的位置pos, //由于是最小的大于a[i] ,pos - 1 的值必然小于a[i] //那么dp[pos] = a[i] ; #include<cstdio> #include<cstring> #include<iostream> using namespace std ; const int maxn = 50001

UVa 10534 Wavio Sequence ( DP 二分 最长递增子序列 )

题意  求一个序列a某一位的最长递增序列(lis)和最长递减序列(lds)中最小值的最大值 开始直接用DP写了   然后就超时了  后来看到别人说要用二分把时间复杂度优化到O(n*logn)   果然如此   用一个栈s保存长度为i的LIS的最小尾部s[i]  top为栈顶即当前LIS的长度  初始s[1]=a[1]  top=1 遍历整个序列  当a[i]>s[top]时  a[i]入栈 in[i]=top   否则 在栈中查找(二分)第一个大于等于a[i]的下标pos  并替换  这样就增加

[ACM] 九度OJ 合唱队形 (最长递增子序列改版)

题目1131:合唱队形 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:1680 解决:520 题目描述: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1, 2, -, K,他们的身高分别为T1, T2, -, TK, 则他们的身高满足T1 < T2 < - < Ti , Ti > Ti+1 > - > TK (1 <= i <=

动态规划之最长递增子序列(LIS)

       在一个已知的序列{ a1,a2,--am}中,取出若干数组成新的序列{ ai1, ai2,-- aim},其中下标 i1,i2, --im保持递增,即新数列中的各个数之间依旧保持原数列中的先后顺序,那么称{ ai1, ai2,--aim}为原序列的一个子序列.若在子序列中,当下标 ix > iy时,aix > aiy,那么称其为原序列的一个递增子序列.最长递增子序列问题就是在一个给定的原序列中,求得其最长递增子序列的长度.       求最长递增子序列的递推公式为: