题目 :
测试样例:
代码:
DP解法,状态d[i]为列表,d[i][0]为以第i个数结尾的序列中最长ZigZag子序列长度,d[i][1]为这个序列的最后一个difference为正还是为负。状态转移有两种,一是新加入的数无法连续成ZigZag序列,则未更新长度;二是新加入的数可以连成ZigZag序列,则序列长度+1。
def zigzag(s):
if len(s)<2: return len(s)
length = 2
d = [[1,0] for i in range(len(s))]
for m in range(len(s)-1):
if s[m]!=s[m+1] : break
if m==len(s)-2 and s[m]==s[m+1]: return 1
if s[m+1]>s[m]:
d[m+1][1] = 1
elif s[m+1]<s[m]:
d[m+1][1] = -1
d[m+1][0] = 2
print d[1]
for i in range(2,len(s)):
for j in range(1,i):
if (s[i]-s[j])*d[j][1]>=0 and d[j][0]>d[i][0]:
d[i][0] = d[j][0]
d[i][1] = d[j][1]
if (s[i]-s[j])*d[j][1]<0 and d[j][0]+1>d[i][0]:
d[i][0] = d[j][0] + 1
d[i][1] = -d[j][1]
if length<d[i]:
length = d[i]
print d[i]
return d[len(s)-1][0]
关键测试样例为重复序列,如[1, 1, 1, 1, 1],[1, 1, 1, 1, 2]。需要定位到第一个不连续相等的数,如上例中的2。