【发布时间】:2016-05-04 02:46:35
【问题描述】:
我正在解决一个编程挑战,以找到 2D NxN 矩阵中最长递增子序列的长度。序列的每个元素中的行和列都必须增加(不需要是连续的)。我用动态编程方法解决了它,但它是 O(N^4) 且效率低下。但是,在 O(N^3) 中有很多解决方案。一种这样的解决方案是:
scanf("%d", &N);
for(i = 1; i <= N; i++) {
for(j = 1; j <= N; j++) {
scanf("%d", &L[i][j]);
}
}
Answer = 0;
memset(maxLength,0,sizeof(maxLength));
for (i=1;i<=N;i++)
{
maxLength[1][i] = 1;
maxLength[i][1] = 1;
}
//
for (i=2;i<=N;i++)
{
memset(minValue,0,sizeof(minValue));
curLen = 1;
minValue[1] = L[i-1][1];
for (j=2;j<=N;j++)
{
for (p=1;p<i;p++)
{
tmpLen = maxLength[p][j-1];
if (minValue[tmpLen] == 0)
{
minValue[tmpLen] = L[p][j-1];
curLen = tmpLen;
}
else if (minValue[tmpLen]>L[p][j-1])
{
minValue[tmpLen] = L[p][j-1];
}
}
max = 1;
for (p=curLen;p>0;p--)
{
if (L[i][j]>=minValue[p])
{
max = p+1;
break;
}
}
maxLength[i][j] = max;
Answer = Answer>max?Answer:max;
}
}
// Print the answer to standard output(screen).
printf("%d\n", Answer);
有人可以解释它是如何工作的或任何其他 O(N^3) 方法吗?我根本听不懂:(。
【问题讨论】:
标签: algorithm dynamic-programming