Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1003608
  • 博文数量: 150
  • 博客积分: 3017
  • 博客等级: 少校
  • 技术积分: 3829
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-19 14:40
个人简介

Now in Baidu WISE team

文章分类

全部博文(150)

文章存档

2014年(8)

2013年(31)

2012年(111)

分类: C/C++

2013-01-08 15:32:43

给定一系列x轴的点坐标,例如 1,3,7,8,9,11这些坐标升序放在数组中,现在给一根绳子,长度为4,问绳子最多能覆盖的点数有多少,例如绳子放前面只能覆盖两个点,1,3,如果放后面能覆盖4个点
 
简单DP.其实也不是十分简单。还得想会儿。设绳长为line, 若包含下标为i的点,往前扩展,最远的可覆盖的点的下标为f(i)
那么,
每次i后移一位,
若 input[i+1] - input[i] <= line
     f(i+1) = f(i)
否则
     f(i+1)  = t, t = min{ f(i) .. i+1} where input[i+1] - input[t]
 

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <memory.h>
  4. #define MAX 1000

  5. int getMaxCount(int *input, int size, int line){
  6.     if(input == NULL || size <= 0 || line == 0) return 0;
  7.     int last = 0;
  8.     int i = 1;
  9.     int max = 1;
  10.     for(;i<size;i++){
  11.         if(input[i] - input[last] <= line){
  12.             max = max>(i-last+1)? max:(i-last+1);
  13.             continue;
  14.         }
  15.         while(input[i]-input[last]>line)
  16.             last++;
  17.     }
  18.     return max;
  19.     
  20. }

  21. int main(){
  22.     int input[] = {1,2,7,8,9,11};
  23.     int line = 4;
  24.     int max = getMaxCount(input, sizeof(input)/sizeof(int), line);
  25.     printf("%d \n", max);
  26. }

阅读(851) | 评论(0) | 转发(1) |
0

上一篇:Poj2092:字符串拉链

下一篇:单链表的快排

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