oyjpArt ACM/ICPC算法程序设计空间

// I am new in programming, welcome to my blog
I am oyjpart(alpc12, 四城)
posts - 224, comments - 694, trackbacks - 0, articles - 6

PKU的Bridging Signals

Posted on 2006-08-08 21:47 oyjpart 阅读(752) 评论(3)  编辑 收藏 引用

PKU的Bridging Signals 在0(n*logn)的设计上写的很复杂,无意见看到下面这个程序(by CQF) 受到启发了!! 呵呵

转CQF大牛的算法:

1、建立一个栈stack,清空。{stack[i]表示当前状态下,所有长度为i的子序中最后一个数的最小值}。//这个太漂亮了:cqf是大牛大牛大大牛呀:)

2、按先后顺序循环序列的每一个数,用操作3修改当前状态

3、如果这个数不小栈顶或栈为空就++stack的长度,否则就用二分法找出一个最小的i使得stack[i]>这个数.将stack[i]更新为这个数。{可以用二分法是因为stack是有序的}

4、输出stack的长度。{最长不下子序长度}

#include <cstdio>
#include <string>

int a[40000], c;

int main()
{
 int m, n, i, k;
 //freopen("in.txt", "r", stdin);
 scanf("%d", &m);
 for(i = 0; i < m; i ++)
 {
  memset(a, 0, sizeof(a));
  scanf("%d", &n);
  c = 0;
  for(k = 0; k < n; k ++)
  {
   int t;
   scanf("%d", &t);
   if(c == 0 || t > a[c - 1])
    a[c ++] = t;
   else
   {
    int l = 0, h = c - 1, mid = (l + h) / 2;
    while(l < h)
    {
     if(a[mid] < t) l = mid + 1;
     else if(a[mid] > t) h = mid;
     mid = (l + h) / 2;
    }
    a[mid] = t;
   }
   //pa();
  }
  printf("%d\n", c);
 }
 return 0;
}

Feedback

# re: PKU的Bridging Signals  回复  更多评论   

2006-08-09 15:04 by
踩,我DP一点都不会啊。5555555555

# re: PKU的Bridging Signals  回复  更多评论   

2006-08-09 21:15 by sicheng
呵呵 ``` 看书啦 我也正在看DP 快有点头绪了```

# re: PKU的Bridging Signals  回复  更多评论   

2006-10-04 12:22 by
解题报告:http://www.mydrs.org/program/list.asp?id=583
我照着写,过了。。:)

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理