最长降序子序列----一道航天标准化笔试题

有一无序整数列 X1,X2,... ,Xn。用从该序列中删除若干数字的方法,使剩下的长度为m的序列成为单调递减的序列。注意,不可以改变序列中数字的顺序关系。要求构造算法求得m值为最大的序列,即删除数字最少,结果序列最长的序列。  例如:  

1) 序列       4,8,6 ,5 ,2 ,1,3,2,1   (n=9)     

    删除3个数  (4),8,6,5,(2),(1),3,2,1     

    结果      8,6,5,3,2,1     (m=6)

2) 序列       4,1,3,2,1,8,0,7,6 ,5 ,1   (n=11)          

    结果     8,7,6,5,1     (m=5)                   

              4,3,2,1,0     (m=5)

    备注:序列2为多解的情况.

 

代码
 
   
package src;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;


public class Psort {
private String input;
private int [] inputInt;
List list_src
= new ArrayList();
List list_des
= new ArrayList();
List list_src2
= new ArrayList();
List list_des2
= new ArrayList();

public Psort() {
// TODO 自动生成构造函数存根
System.out.println( " 请用中文输入法输入数字序列,用\ " ,\ " 隔开 " );
input
= this .inputFromKeyBoard();
String[] inputChar
= input.split( " " );
inputInt
= new int [inputChar.length];
for ( int i = 0 ;i < inputChar.length;i ++ ){
inputInt[i]
= Integer.parseInt(inputChar[i]);
}
initLinks();
AG();
while ( ! isOver()){
list_des2
= list_des;
AG();
}
for ( int i = 0 ;i < list_des2.size();i ++ ) {
link link
= (link) list_des2.get(i);
System.out.println(
" 数目: " + link.count);
System.out.println(
" 路径: " + link.road);
}
}

public boolean isOver(){
if (list_src.size() >= 1 ){
return false ;
}
return true ;
}

public void AG(){
list_des
= new ArrayList();
for ( int i = 0 ;i < list_src.size();i ++ ){
for ( int j = 0 ;j < list_src2.size();j ++ ){
link link_i
= (link)list_src.get(i);
link link_j
= (link)list_src2.get(j);
if (link_i.n_value == link_j.p_value && link_i.n_i != link_j.n_i && link_i.n_i <= link_j.p_i){
link link_new
= new link(link_i.p_value,link_i.p_i,link_j.n_value,link_j.n_i,link_i.count + link_j.count - 1 ,link_i.road);
list_des.add(link_new);
}
}
}
list_src
= list_des;
}

public void initLinks(){
for ( int i = 0 ;i < inputInt.length;i ++ ){
for ( int j = i + 1 ;j < inputInt.length;j ++ ){
if (inputInt[i] >= inputInt[j]){
list_src.add(
new link(inputInt[i],i,inputInt[j],j, 2 ,String.valueOf(inputInt[i])));
}
}
}
list_src2
= list_src;
}

/**
*
@param args
*/
public static void main(String[] args) {
// TODO 自动生成方法存根
new Psort();
}

// 键盘输入,返回字符串
public String inputFromKeyBoard(){
String str
= null ;
try {
InputStreamReader inputReader;
BufferedReader bufReader;
inputReader
= new InputStreamReader(System.in);
bufReader
= new BufferedReader(inputReader);
str
= bufReader.readLine();
}
catch (IOException e){
e.printStackTrace();
}
return str;
}
// *****************************************************************************

}
class link{
public int p_value;
public int p_i;
public int n_value;
public int n_i;
public int count;
public String road;

public link( int p_value, int p_i, int n_value, int n_i, int count,String road){
this .p_value = p_value;
this .p_i = p_i;
this .n_value = n_value;
this .n_i = n_i;
this .count = count;
this .road = road + " " + n_value;
}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值