【问题标题】:USACO - Dynamic Programming - Maximum Decreasing SubsequenceUSACO - 动态规划 - 最大递减子序列
【发布时间】:2012-10-25 19:13:52
【问题描述】:

我对 USACO 培训的 TEXT 动态编程部分中编写的关于经典问题(寻找最大递减子序列)的代码感到困惑。这是Article Link。请帮我搞定!

代码如下:

 1  #include <stdio.h>
 2  #define MAXN 200000
 3  main () {
 4      FILE *in, *out;
 5      long num[MAXN], bestrun[MAXN];
 6      long n, i, j, highestrun = 0;
 7      in = fopen ("input.txt", "r");
 8      out = fopen ("output.txt", "w");
 9      fscanf(in, "%ld", &n);
10      for (i = 0; i < n; i++) fscanf(in, "%ld", &num[i]);
11      bestrun[0] = num[n-1];
12      highestrun = 1;
13      for (i = n-1-1; i >= 0; i--) {
14          if (num[i] < bestrun[0]) {
15            bestrun[0] = num[i];
16            continue;
17        }
18        for (j = highestrun - 1; j >= 0; j--) {
19            if (num[i] > bestrun[j]) {
20                if (j == highestrun - 1 || num[i] < bestrun[j+1]){
21                    bestrun[++j] = num[i];
22                    if (j == highestrun) highestrun++;
23                    break;
24                }
25            }
26        }
27      }
28      printf("best is %d\n", highestrun);
29      exit(0);
30  }

我有 3 个问题:

1) 第 14-17 行到底是做什么的? 例如对于序列 10, 2, 8, 9, 4, 6, 3 ,该代码的结果是 4 但它的子序列是 10, 8, 4, 2 是错误的,因为原始序列中的元素 2 是在 8 和 4 之前,但在结果子序列中是在 8 和 4 之后!

2) 考虑序列 5, 10, 8, 9, 4, 6, 3。根据上面的代码,最大递减子序列的长度是 4,这个子序列是 10,5,4,3。但是在这个与原序列5相反的子序列在10之后。

3) 是否有必要在内部循环中检查num[i] &lt; bestrun[j+1] 条件?我认为它之前满足num[i] &gt; bestrun[j] 条件。

我在等你有用的答案。
感谢您的帮助!

【问题讨论】:

    标签: dynamic-programming lds


    【解决方案1】:

    1) bestrun[i] 跟踪长度为 i + 1 的最长递减子序列的开始的最小整数。因此,如果遇到小于当前 bestrun[0] 的值,则需要更改bestrun[0] 到那个值,因为这将是长度为 1 的最小递减子序列。

    2) 我不太确定你在问什么。如果您想知道翻转序列时会发生什么,那么您可以运行最长递增子序列算法来获得相同的结果。

    3) 是的,这似乎是多余的,因为bestrun 应该不会增加。事实上,最长递增/递减子序列的一些实现利用这一事实,通过进行二分查找以找到最高的j 使得num[i] 大于bestrun[j],从而将运行时间提高到O(n log n)。

    【讨论】:

    • 我明白了!感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 2017-04-26
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 2019-05-28
    相关资源
    最近更新 更多