Chinaunix首页 | 论坛 | 博客
  • 博客访问: 97531
  • 博文数量: 21
  • 博客积分: 145
  • 博客等级: 入伍新兵
  • 技术积分: 250
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-22 17:37
文章分类

全部博文(21)

文章存档

2013年(16)

2012年(5)

我的朋友

分类: C/C++

2013-03-20 16:20:22

求最长递增子序列
原题链接 

一道经典的动态规划题目,思路很简单。
可以考虑以第i个数字结尾的最长子串:length[i] = max{length[j] && seq[j] < seq[i]} + 1, for j = 0 ... i-1
这样时间复杂度为O(N^2)

在原题的基础上,我又加入了可以输出一个最长子串的功能,呵呵,只是为了好玩。但是直接提交肯定会WRONG ANSWER

上代码:

点击(此处)折叠或打开

  1. #include <iostream>

  2. using namespace std;

  3. #define MAX 1000

  4. int size;
  5. int seq[MAX];
  6. int trace[MAX];
  7. int length[MAX];
  8. int endPos;

  9. int maxIncSubseq() {
  10.     int maxLength = 1;
  11.     endPos = 0;
  12.     trace[0] = -1;
  13.     length[0] = 1;
  14.     
  15.     for (int i=1; i<size; i++) {
  16.         int curMax = 0;
  17.         for (int j=0; j<i; j++) {
  18.             if (seq[i] > seq[j] && length[j]+1 > curMax) {
  19.                 curMax = length[j] + 1;
  20.                 trace[i] = j;
  21.             }
  22.         }
  23.         length[i] = curMax;
  24.         if (curMax > maxLength) {
  25.             maxLength = curMax;
  26.             endPos = i;
  27.         }
  28.     }

  29.     return maxLength;
  30. }

  31. void printSeq(int pos) {
  32.     if(trace[pos] == -1) {
  33.         cout << seq[pos];
  34.         return;
  35.     }
  36.     printSeq(trace[pos]);
  37.     cout << " " << seq[pos];
  38. }

  39. int main() {
  40.     while (cin >> size) {
  41.         for (int i=0; i<size; i++)
  42.             cin >> seq[i];
  43.         cout << maxIncSubseq() << endl;
  44.         printSeq(endPos);
  45.         cout << endl;
  46.     }
  47.     return 0;
  48. }


阅读(577) | 评论(0) | 转发(0) |
0

上一篇:POJ3356解题报告

下一篇:POJ1577

给主人留下些什么吧!~~