BZOJ 3357: [Usaco2004]等差数列

3357: [Usaco2004]等差数列

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 338  Solved: 160
[Submit][Status][Discuss]

Description

约翰发现奶牛经常排成等差数列的号码.他看到五头牛排成这样的序号:“1,4,3,5,7”

很容易看出“1,3,5,7”是等差数列.

给出N(1≤N≤2000)数字AI..AN(O≤Ai≤10^9),找出最长的等差数列,输出长度.

Input

第1行:一个整数N.

第2到N+1行:每行一个整数Ai,表示牛的号码.

Output

最长等差数列的长度.

Sample Input

5
1
4
3
5
7

Sample Output

4

HINT

Source

Green

[Submit][Status][Discuss]

OTZ 美帝神题

本来想的是用SORT或HASH离散化所有的可能的公差,然后再分别跑个最长路,复杂度大概是$O(N^{2}log_{N})$或$O(N^{2})$的,然而好麻烦,不想写,(╯▔皿▔)╯

后来看到大家标的tag都是DP,动态规划之类的,想到可以直接在DP数组上做文章,看大多数懒人都是用的STL的map<int,int>勉强卡到9s,也有勤快人手写HASH表什么的。可惜BZOJ不支持C++14,不然有了unordered_map事情会简单很多。

写着写着就WA了,看看PoPoQQQ等大爷的题解才发现特殊处理蛮多的(起码有两处吧,2333~~~)。

 1 #include <bits/stdc++.h>
 2
 3 const int mxn = 2005;
 4
 5 int n, ans, s[mxn];
 6
 7 std::map<int, int> f[mxn];
 8
 9 signed main(void)
10 {
11     scanf("%d", &n);
12
13     if (n == 1)puts("1");
14     else
15     {
16         for (int i = 1; i <= n; ++i)
17             scanf("%d", s + i);
18
19         for (int i = 1; i <= n; ++i)
20             for (int j = 1; j < i; ++j)
21             {
22                 using std::max;
23                 f[i][s[j]] = max(f[i][s[j]], 2);
24                 f[i][s[j]] = max(f[i][s[j]], f[j][(s[j] << 1) - s[i]] + 1);
25
26                 ans = max(ans, f[i][s[j]]);
27             }
28
29         printf("%d\n", ans);
30     }
31 }

@Author: YouSiki

时间: 2024-11-25 08:46:03

BZOJ 3357: [Usaco2004]等差数列的相关文章

BZOJ 3357: [Usaco2004]等差数列( dp )

dp(x, p) 表示序列中第x个数, 上一个数是p构成的等差数列的最长. 转移时从[1, x)中枚举p = seq[] 就行了.时间复杂度O(n²logn) --------------------------------------------------------------------------------- #include<bits/stdc++.h> #define rep(i, n) for(int i = 0; i < n; i++) #define Rep(i,

BZOJ 3357 Usaco2004 等差数列 动态规划

题目大意:给定一个长度为n的序列,求最大等差子序列 令f[i][j]表示当前等差数列最后一个数为a[i],倒数第二个数为j的最长长度 则有f[i][a[j]]=max{2,f[j][a[j]*2-a[i]]+1} 注意n=1时输出1 时间复杂度O(n^2logn) #include <map> #include <cstdio> #include <cstring> #include <iostream> #include <algorithm>

等差数列(bzoj 3357)

Description 约翰发现奶牛经常排成等差数列的号码.他看到五头牛排成这样的序号:"1,4,3,5,7" 很容易看出"1,3,5,7"是等差数列. 给出N(1≤N≤2000)数字AI..AN(O≤Ai≤10^9),找出最长的等差数列,输出长度. Input 第1行:一个整数N. 第2到N+1行:每行一个整数Ai,表示牛的号码. Output 最长等差数列的长度. Sample Input 5 1 4 3 5 7 Sample Output 4 /* f[i][

BZOJ 3384: [Usaco2004 Nov]Apple Catching 接苹果( dp )

dp dp( x , k ) = max( dp( x - 1 , k - 1 ) + *** , dp( x - 1 , k ) + *** ) *** = 0 or 1 ,根据情况 (BZOJ 1750双倍经验) ------------------------------------------------------------------------ #include<cstdio> #include<cstring> #include<algorithm>

BZOJ 3389: [Usaco2004 Dec]Cleaning Shifts安排值班

题目 3389: [Usaco2004 Dec]Cleaning Shifts安排值班 Time Limit: 1 Sec  Memory Limit: 128 MB Description 一天有T(1≤T≤10^6)个时段.约翰正打算安排他的N(1≤N≤25000)只奶牛来值班,打扫 打扫牛棚卫生.每只奶牛都有自己的空闲时间段[Si,Ei](1≤Si≤Ei≤T),只能把空闲的奶牛安排出来值班.而且,每个时间段必需有奶牛在值班.  那么,最少需要动用多少奶牛参与值班呢?如果没有办法安排出合理的

BZOJ 3390: [Usaco2004 Dec]Bad Cowtractors牛的报复

题目 3390: [Usaco2004 Dec]Bad Cowtractors牛的报复 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 53  Solved: 37[Submit][Status] Description 奶牛贝茜被雇去建设N(2≤N≤1000)个牛棚间的互联网.她已经勘探出M(1≤M≤ 20000)条可建的线路,每条线路连接两个牛棚,而且会苞费C(1≤C≤100000).农夫约翰吝啬得很,他希望建设费用最少甚至他都不想给贝茜工钱. 

Bzoj 3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一

3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 64  Solved: 37[Submit][Status][Discuss] Description 很少人知道其实奶牛非常喜欢到洞穴里面去探险. 洞窟里有N(1≤N≤100)个洞室,由M(1≤M≤1000)条双向通道连接着它们.每对洞室间 至多只有一条双向通道.有K(1≤K≤14)个洞室,里面放有1捆干草.牛吃1捆

bzoj 3373: [Usaco2004 Mar]Lying Livestock 说谎的牲畜

3373: [Usaco2004 Mar]Lying Livestock 说谎的牲畜 Description 兽群中总是有一些麻烦制造者.约翰知道他的N(1≤N≤100)头奶牛中有一头总是说谎,其他的总是说真话.他想快速的找出这个麻烦制造者.为了实现这个目标,他一个一个的问这些奶牛Q(1≤Q≤1000)个关于它们吃草的简单问题(虽然大多数奶牛是诚实的但它们依旧很笨只能懂得一些关于食物的话题). 他将这些问题用以下的格式写了下来: 牛4说:牛5比牛10吃得多 牛6说:牛10比牛7吃得多 牛3说:牛

BZOJ 3391: [Usaco2004 Dec]Tree Cutting网络破坏( dfs )

因为是棵树 , 所以直接 dfs 就好了... ------------------------------------------------------------------------------------- #include<cstdio> #include<cstring> #include<algorithm> #include<iostream> #define rep( i , n ) for( int i = 0 ; i < n