class max_asc_seq implements I_algorithm {
/**
* 問題:尋找最長的單調遞增子序列 思路:用b[j]表示以第j個數到最後一個數的最長單調遞增子序列,再從後向前遍歷,查找試b[j]最大的值
* */
private int[] data;
private int length;
private int[] result;
int[] temp;
double time;
public max_asc_seq() {
}
@Override
public void Init() {
length = 100;
data = new int[length];
}
@Override
public void CreateData() {
Random r = new Random();
for (int j = 0; j < this.length; j++)
data[j] = r.nextInt(this.length);
// int[]a={1,17,14,6,76,4,58,34,86,2,46,92,96,93,28,95,99,64,68,34};
// data=a;
}
@Override
public void RunAlgorithm() {
long base=System.currentTimeMillis();
temp= new int[this.length];
int maxat = this.length - 1;
for (int j = 0; j < this.length; j++)
temp[j] = 1;
for (int j = this.length - 2; j >= 0; j--) {
for (int k = this.length - 1; k > j; k--)
if (data[k] > data[j] && temp[k] + 1 > temp[j])
temp[j] = temp[k] + 1;
if (temp[j] >= temp[maxat]) {
maxat = j;
}
}
this.result = new int[temp[maxat]];
this.result[0] = this.data[maxat];
int next = 1;
next = 1;
for (int k = maxat + 1; k < this.length; k++)
if (data[k] > data[maxat] && temp[k] + 1 == temp[maxat]) {
this.result[next++] = this.data[k];
maxat = k;
}
this.time=(System.currentTimeMillis()-base)/1000.0;
}
@Override
public boolean IsRunCorrect() {
return true;
}
@Override
public void ShowResult() {
System.out.println("給定序列:");
showInts(this.data);
System.out.println("最長遞增子序列序列:");
this.showInts(this.result);
System.out.println("運行時間:"+time);
// System.out.println("temp:");
// this.showInts(temp);
}
private void showInts(int[]a) {
for (int k = 0; k < a.length / 10; k++) {
for (int j = 0; j < 9; j++)
System.out.print(String.format("%4s", a[k * 10 + j] + ","));
System.out.println(a[k * 10 + 9]);
}
if (a.length % 10 != 0) {
for (int k = a.length / 10 * 10; k < a.length - 1; k++)
System.out.print(String.format("%4s", a[k ] + ","));
System.out.println(String.format("%4s", a[a.length-1]+"" ));
}
}
@Override
public void ShowOriginalData() {
System.out.println("給定序列:");
for (int j = 0; j < this.length - 1; j++)
System.out.print(data[j] + ",");
System.out.println(data[length - 1]);
}
}
尋找最長遞增子序列
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.