題目描述:http://community.topcoder.com/stat?c=problem_statement&pm=1259&rd=4493
題目大意如下——定義Zig-Zag序列:相連數字之間的差嚴格地正數和負數之間波動,不能是0。例如,(1,7,4,9,2,5)是Zig-Zag序列,而(1,4,7,2,5)和(1,7,4,5,5)不是Zig-Zag序列。現在給定一串序列,求其中最長的Zig-Zag子序列的長度。
思路:和求解最長上升子序列的思想一樣,len[i]表示以num[i]結尾的最長Zig-Zag子序列長度,len[i]=max { len[j]+1 | 1<=j<i&&num[i]和以num[j]結尾的Zig-Zag子序列構成合法的Zig-Zag子序列},要注意的是,對相同元素序列地特判。
public class ZigZag {
public int longestZigZag(int[] sequence){
if(sequence.length==1) return 1;
int[] pre = new int[sequence.length];
int[] len = new int[sequence.length];
pre[0] = 0;
len[0] = 1;
if(sequence[0] != sequence[1]){
pre[1] = 0;
len[1] = 2;
}
else{
pre[1] = 1;
len[1] = 1;
}
int ans = len[1];
for(int i=2;i<sequence.length;i++)
{ int tmp = -1;
for(int j=0;j<i;j++)
{
if(j==pre[j]){
if(sequence[i]!=sequence[j]){
if(len[j]+1>tmp){
tmp = len[j]+1;
pre[i] = j;
}
}else{
if(1>tmp){
tmp = 1;
pre[i] = i;
}
}
}
else
{
if((sequence[i]>sequence[j])&&(sequence[pre[j]]>sequence[j])){
if(len[j]+1>tmp){
tmp = len[j]+1;
pre[i] = j;
}
}else if((sequence[i]<sequence[j])&&(sequence[pre[j]]<sequence[j])){
if(len[j]+1>tmp){
tmp = len[j]+1;
pre[i] = j;
}
}
}
}
len[i] = tmp;
if(len[i]>ans) ans = len[i];
}
return ans;
}
}