传统的最长增长子序列问题。 这是递归版本(不是DP版本) 我意识到版本1代码有一个错误,所以我将其更改为版本2.
我不清楚为什么version2有效,而version1有输入A0的错误
请参阅下面的版本1和版本2:
static int lis1(int[] v) {
int maxLen = 1;
for(int i = 1; i < v.length; i++) {
List<Integer> w = new ArrayList<Integer>();
for( int j = 0; j < i; j++) {
if( v[j] < v[i] ) {
w.add(v[j]);
}
}
// it used to be the following one line which has bug for input A0
//cand = lis1(l2a(w)) + 1; // version1
// so I changed it to the following, but can't clearly understand why it works.
// without this part, it has but for input A0
int cand = 1; // version2
if(v[i-1] < v[i])
cand = lis1(l2a(w)) + 1;
else
cand = lis1(l2a(w));
maxLen = Math.max(maxLen, cand);
}
return maxLen;
}
public static void main(String[] args) {
int[] A0 = {3, 2, 5, 6}; // for this input version1 had a bug which printed out 4 ( instead of 3 )
int[] A1 = {1, 2, 3, 3, 2, 4, 6, 7}; // 6
int[] A2 = { 10, 22, 9, 33, 21, 50, 41, 60, 80 }; // 6
int[] A3 = { 5, 0, 4, 2, 3, 7, 1 }; // 4
int[] A4 = { 2, 7, 3, 4, 9, 8, 12 }; // 5
int[] A5 = {3, 4, 2, 5 }; // 3
答案 0 :(得分:1)
实际上......你的版本都没有。尝试放A0={3,2,7,6}
,你的v2返回2,显然是错误的。
对于v1,对于v={3,2}
,答案应为1,对吧?让我们看看你的代码做了什么。当索引为i=1
时,w
内部for
循环后的{}
等于w={}
。然后你对maxlen
进行了递归调用,它应该返回0,但它返回1.为什么,因为你的1
变量,用{3,2,5,6}
错误地初始化了。此错误传播到整个if
并给出错误的答案。
v2意外地解决了这个问题,因为(3<2)
条件失败maxlen
,它返回先前返回的1。
只需删除整个版本2,更正for(int i = 1; i < v.length; i++)
初始化。并使用i=0
启动外部循环static int lis1(int[] v) {
int maxLen = 0;
for(int i = 0; i < v.length; i++) {
List<Integer> w = new ArrayList<Integer>();
for( int j = 0; j < i; j++) {
if( v[j] < v[i] ) {
w.add(v[j]);
}
}
cand = lis1(l2a(w)) + 1; // version1
maxLen = Math.max(maxLen, cand);
}
return maxLen;
}
,否则单元素数组将获得0。
QMAKE_CC = /path/to/the/c/compiler
QMAKE_CXX = /path/to/the/c++/compiler