Chinaunix首页 | 论坛 | 博客
  • 博客访问: 65345
  • 博文数量: 115
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-08 19:09
文章分类
文章存档

2015年(115)

我的朋友

分类: C/C++

2015-08-06 16:43:02

给定一系列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. }

阅读(180) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~