Almost Arithmetical Progression
2016-09-28 13:19
429 查看
Description
Gena loves sequences of numbers. Recently, he has discovered a new type of sequences which he called an almost arithmetical progression. A sequence is an almost arithmetical progression, if its elements can be represented
as:
a1 = p, where p is some integer;
ai = ai - 1 + ( - 1)i + 1·q(i > 1),
where q is some integer.
Right now Gena has a piece of paper with sequence b, consisting of n integers. Help Gena, find there the longest subsequence
of integers that is an almost arithmetical progression.
Sequence s1, s2, ..., sk is a subsequence of sequence b1, b2, ..., bn,
if there is such increasing sequence of indexesi1, i2, ..., ik(1 ≤ i1 < i2 < ...
< ik ≤ n), that bij = sj.
In other words, sequence s can be obtained from b by crossing out some elements.
Input
The first line contains integer n(1 ≤ n ≤ 4000). The next line contains n in
4000
tegers b1, b2, ..., bn(1 ≤ bi ≤ 106).
Output
Print a single integer — the length of the required longest subsequence.
Sample Input
Input
Output
Input
Output
Hint
In the first test the sequence actually is the suitable subsequence.
In the second test the following subsequence fits: 10, 20, 10.
/*求最长的子序列,满足隔位的两个数相等*/
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 4000 + 10;
int n;
int b[MAXN];
int dp[MAXN][MAXN];//定义状态dp[i][j]代表以第i个数为末尾,第j个数为倒数第二个的情况下的最长子序列。
int main()
{
while (scanf("%d", &n) == 1)
{
for (int i = 1; i <= n; ++i)
{
scanf("%d", &b[i]);
}
int ret = 0;
dp[0][0] = 0;
for (int j = 1; j <= n; ++j)
{
for (int i = 0, last = 0; i < j; ++i)
{
dp[i][j] = dp[last][i] + 1;
if (b[i] == b[j])
{
last = i;
}
ret = max(ret, dp[i][j]);
}
}
printf("%d\n", ret);
}
return 0;
}
Gena loves sequences of numbers. Recently, he has discovered a new type of sequences which he called an almost arithmetical progression. A sequence is an almost arithmetical progression, if its elements can be represented
as:
a1 = p, where p is some integer;
ai = ai - 1 + ( - 1)i + 1·q(i > 1),
where q is some integer.
Right now Gena has a piece of paper with sequence b, consisting of n integers. Help Gena, find there the longest subsequence
of integers that is an almost arithmetical progression.
Sequence s1, s2, ..., sk is a subsequence of sequence b1, b2, ..., bn,
if there is such increasing sequence of indexesi1, i2, ..., ik(1 ≤ i1 < i2 < ...
< ik ≤ n), that bij = sj.
In other words, sequence s can be obtained from b by crossing out some elements.
Input
The first line contains integer n(1 ≤ n ≤ 4000). The next line contains n in
4000
tegers b1, b2, ..., bn(1 ≤ bi ≤ 106).
Output
Print a single integer — the length of the required longest subsequence.
Sample Input
Input
2 3 5
Output
2
Input
4 10 20 10 30
Output
3
Hint
In the first test the sequence actually is the suitable subsequence.
In the second test the following subsequence fits: 10, 20, 10.
/*求最长的子序列,满足隔位的两个数相等*/
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 4000 + 10;
int n;
int b[MAXN];
int dp[MAXN][MAXN];//定义状态dp[i][j]代表以第i个数为末尾,第j个数为倒数第二个的情况下的最长子序列。
int main()
{
while (scanf("%d", &n) == 1)
{
for (int i = 1; i <= n; ++i)
{
scanf("%d", &b[i]);
}
int ret = 0;
dp[0][0] = 0;
for (int j = 1; j <= n; ++j)
{
for (int i = 0, last = 0; i < j; ++i)
{
dp[i][j] = dp[last][i] + 1;
if (b[i] == b[j])
{
last = i;
}
ret = max(ret, dp[i][j]);
}
}
printf("%d\n", ret);
}
return 0;
}
相关文章推荐
- 搭建Hadoop2.5.2+Hive2.1+Mysql
- 一个广告净化大师拦截视频网站片头广告的实现
- iOS开发UI篇—CAlayer层的属性
- EFK日志管理初探
- 高通8937平台手机关机概率卡住问题分析
- Poedu_C语言_lesson17_20160918_运算符简介
- 4519: [Cqoi2016]不同的最小割
- HDU1049
- 微信小程序,大多数人都搞错的八个问题
- 【BZOJ1006】【HNOI2008】神奇的国度
- 笔记本中美化代码的方法
- 设计模式-单例模式
- atof函数详解
- 电子工程师必会的十大电子元器件
- 蓝鸥零基础学习HTML5第九讲 兼容性六
- 6.Laravel自定义类引入和命名空间问题
- 你的灯亮着吗?
- WKWebView针对于Cordova的IOS平台性能提升
- view可以跟随滑动,且滑过一定高度固定在头部
- 从虚短虚断分析基本的运算放大电路