【发布时间】:2011-10-18 09:39:10
【问题描述】:
谁能帮我理解http://www.topcoder.com/stat?c=problem_statement&pm=1259&rd=4493中提到的问题的解决方案背后的核心逻辑
之字形序列是交替增加和减少的序列。所以,1 3 2 是之字形,但 1 2 3 不是。任何一个或两个元素的序列都是曲折的。我们需要找到给定序列中最长的 zig zag 子序列。子序列意味着元素不必是连续的,就像在最长递增子序列问题中一样。因此, 1 3 5 4 2 可以将 1 5 4 作为 zig zag 子序列。我们对最长的感兴趣。
我了解这是一个动态规划问题,与How to determine the longest increasing subsequence using dynamic programming?非常相似。
我认为任何解决方案都需要一个迭代不同长度序列的外循环,而内循环必须迭代所有序列。
我们将在另一个数组中存储以索引 i 结尾的最长 zig zag 序列,例如索引 i 处的 dpStore。因此,中间结果被存储起来,以后可以重用。这部分对所有动态规划问题都是通用的。稍后我们找到全局最大值并将其返回。
我的解决方案肯定是错误的,在这里粘贴以显示我到目前为止的内容。我想知道我哪里出错了。
private int isZigzag(int[] arr)
{
int max=0;
int maxLength=-100;
int[] dpStore = new int[arr.length];
dpStore[0]=1;
if(arr.length==1)
{
return 1;
}
else if(arr.length==2)
{
return 2;
}
else
{
for(int i=3; i<arr.length;i++)
{
maxLength=-100;
for(int j=1;j<i && j+1<=arr.length; j++)
{
if(( arr[j]>arr[j-1] && arr[j]>arr[j+1])
||(arr[j]<arr[j-1] && arr[j]<arr[j+1]))
{
maxLength = Math.max(dpStore[j]+1, maxLength);
}
}
dpStore[i]=maxLength;
}
}
max=-1000;
for(int i=0;i<arr.length;i++)
{
max=Math.max(dpStore[i],max);
}
return max;
}
【问题讨论】:
-
您的第一个链接需要注册才能访问。如果问题描述包含在您的问题中,则回答起来会容易得多。
-
很抱歉我没有注意到...我会快速说明问题。
-
你也知道如何解决基本的最长递增子序列(没有锯齿形)吗?这只是对它的一个小修改,使用相同的技术来解决。
-
在
1 3 5 4 2中,整个序列是zig-zag。您没有提到应该如何处理相等的数字,但不包括相等的数字,并不是所有不增加或减少的序列(这些序列也没有锯齿形子序列,除了微不足道的 1 或 2 元素序列)。那么,1 1 1是增加还是减少? -
嗯,您链接到的问题与您所描述的完全不同。你能决定哪一个你需要帮助吗?
标签: algorithm dynamic-programming