题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5064

题目意思:给出n个数:a1, a2, ..., an,然后需要从中找出一个最长的序列 b1, b2, ...,  bt。需要满足两个条件(1)b1≤b2≤…≤bt   (2)b2−b1≤b3−b2≤⋯≤bt−bt−1。求出最大的 t 为多少。

  遗留大半年的题目呀呀呀呀~~~~!!!首先非常感谢乌冬子大半年前的指点迷津,呕心沥血想了大半天举出个反例,以便指出我算法的错误。为了纪念这个伟大的人物(hoho  n_n),我就以他给出的数据作为例子吧。

  一开始我真的觉得那个M是多余的,其实不然,由于M最大为 222 (4194304,计算机算出来的,千真万确!)。 那么每个数都是不同的最长数列是这样的:1, 2,3,...,n 。等差数列,即(1+n)*n / 2 = 4194304 , 算出来的 n 大概为3000,这个暗示我们开的数组大小为3000就足够了。

  先看这组数据,不难发现,最优解是选择 10 11 12 13 100.

1
7 148
1 1 10 11 12 13 100

  首先需要从小到大排序,把重复的数去掉,这个可以参考官方题解。

  设dp[i][j]表示以第 j 个数为结尾,它前一个数为第 i 个且满足题目两个条件的最大选择个数。

可以写出这样的状态转移方程,

  dp[i][j] = max(dp[i][j], dp[k][i]+1), k <= i < j  && b[i]-b[k] <= b[j]-b[i]

  dp[k][i] 表示在 i 之前,以第 k 个数结尾,能使得 b[i]-b[k] <= b[j]-b[i],即相对单纯地以第 i 个数结尾,b[i]-b[k] 的差比 b[j]-b[i] 还要小或者相等。然后就更新 dp[i][j] 的值了。

  至于复杂度从O(x^3)  到  O(x^2) 可以参考其他题解,因为。。。俺还是不太完全理解 T_T

  代码中还有个小地方希望有识之士提点提点,不胜感激~~~

  

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std; const int maxn = ;
int a[maxn*maxn];
int cnt[maxn], dp[maxn][maxn]; int main()
{
#ifndef ONLINE_JUDGE
freopen("in1.txt", "r", stdin);
#endif // ONLINE_JUDGE int cas, cur, n, m;
while (scanf("%d", &cas) != EOF) {
while (cas--) {
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++) {
scanf("%d", a+i);
}
sort(a+, a++n); cnt[cur=] = ;
for (int i = ; i <= n; i++) {
if (a[i] == a[cur]) {
cnt[cur]++;
}
else {
a[++cur] = a[i];
cnt[cur] = ;
}
}
memset(dp, , sizeof(dp));
n = cur;
for (int i = ; i <= n; i++) {
dp[i][i] = cnt[i];
} int ans = ;
for (int i = ; i <= n; i++) {
int k = i;
int tmp = dp[i][i];
ans = max(tmp, ans); // 没了这个会wa,疑问?
for (int j = i+; j <= n; j++) {
for ( ; k >= && a[i]-a[k] <= a[j]-a[i]; k--) {
tmp = max(tmp, dp[k][i]+); }
dp[i][j]= tmp;
ans = max(ans, tmp);
}
}
printf("%d\n", ans);
}
}
return ;
}

Bestcoder13 1003.Find Sequence(hdu 5064) 解题报告的更多相关文章

  1. BestCoder3 1002 BestCoder Sequence(hdu 4908) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4908 题目意思:给出 一个从1~N 的排列你和指定这个排列中的一个中位数m,从这个排列中找出长度为奇数 ...

  2. BestCoder11(Div2) 1003 Boring count (hdu 5056) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5056 题目意思:给出一条只有小写字母组成的序列S,问当中可以组成多少条每个字母出现的次数 <= ...

  3. 【九度OJ】题目1442:A sequence of numbers 解题报告

    [九度OJ]题目1442:A sequence of numbers 解题报告 标签(空格分隔): 九度OJ 原题地址:http://ac.jobdu.com/problem.php?pid=1442 ...

  4. BestCoder13 1001.Beautiful Palindrome Number(hdu 5062) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5062 题目意思:给出 N,找出 1 - 10^N 中满足 Beautiful Palindrome N ...

  5. BestCoder9 1003 Revenge of kNN(hdu 4995) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4995 题目意思:在一个一维坐标轴上,给出位置 xi 和值 vi,对于 M 次询问,每次询问给出inde ...

  6. BestCoder18 1002.Math Problem(hdu 5105) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5105 题目意思:给出一个6个实数:a, b, c, d, l, r.通过在[l, r]中取数 x,使得 ...

  7. BestCoder17 1002.Select(hdu 5101) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5101 题目意思:给出 n 个 classes 和 Dudu 的 IQ(为k),每个classes 都有 ...

  8. BestCoder10 1001 Revenge of Fibonacci(hdu 5018) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5018 题目意思:给出在 new Fibonacci 中最先的两个数 A 和 B(也就是f[1] = A ...

  9. BestCoder8 1001.Summary(hdu 4989) 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4989 题目意思:给出 n 个数,然后将这些数两两相加,得到 n*(n-1) /2 对和,把重复的和去掉 ...

随机推荐

  1. linux网络:常用命令(一)

    1.ifconfig  可以查看Linux的网卡情况 ifconfig eth0 查看 eth0的信息 给一块网卡设置多个ip地址: ifconfig eth0:0 192.168.1.12 255. ...

  2. HTML5+学习笔记1-------边看代码边研究中

    document.addEventListener('touchstart',function(){ return false; },true); touchstart当手指触摸屏幕时候触发,即使已经 ...

  3. freemarker初级教程(一)

    序,freemarker是一个模板引擎 一.好处 MVC分离 易于扩展 分离可视化设计和应用程序逻辑 分离页面设计员和程序员. 处理XML和HTML都可以,可以从文本文件读取 二.

  4. 使用Javascript实现返回顶部功能。

    为了提高网站的浏览体验及友好度,相信大部分网站需要一个返回顶部的按钮,如果使用传统的a标记,再做一个div加上链接的话,非常麻烦,不仅每个页面都需要添加,而且不能实现非常智能的效果及简化维护时间. 下 ...

  5. poj3070 (斐波那契,矩阵快速幂)

    Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9630   Accepted: 6839 Descrip ...

  6. 串行移位锁存并行输出可级联器件74HC595

    一.背景 老同学今天突然咨询关于74HC595,自己没用过,同学说可以级联10级!10级?我艹,这么叼,级联又是 什么鬼,这勾起了我极大兴趣,二话不说,手册down下来研究,并在此做个记录. 二.正文 ...

  7. STAR-H1208M集线器不支持同时挂载多个nfs

    今天在两个触摸屏上都加入了开机加载nfs的操作. 没想到会出现以下错误: pmap_getmaps.c: rpc problem: RPC: Unable to receive; errno = Co ...

  8. 关于sql用<>不等于查询数据不对问题

    平常查询数据 ' 当想要查询 不等于1 的数据的时候,一般会这样查询 ' 此处查询结果没查到所有想要的结果,如果night_flag 列数据为 null时,此行数据是查询不到的. 解决方法一: ' 解 ...

  9. DAY2 Python 标准库 -> Getpass 模块 -> 命令行下输入密码的方法.

    getpass 模块 getpass 模块提供了平台无关的在命令行下输入密码的方法. getpass(prompt) 会显示提示字符串, 关闭键盘的屏幕反馈, 然后读取密码. 如果提示参数省略, 那么 ...

  10. 使用Monitor调试Unity3D Android程序日志输出(非DDMS和ADB)

    使用Monitor调试Unity3D Android程序日志输出(非DDMS和ADB) http://www.cnblogs.com/mrkelly/p/4015245.html 以往调试Androi ...