Codeforces 156C Almost Arithmetical Progression

题意:给你一个数列,问你其中最长波形子序列(a,b,a,b,a,b这样)最长为多少.

解题思路:找到pre[i][j],就是 在 i 前面 且等于 a[i] 且离 i最近的值, dp[i][j] = dp[j][pre[j][i]] + 1;

解题代码:

 1 // File Name: 255c.cpp
 2 // Author: darkdream
 3 // Created Time: 2015年03月10日 星期二 16时26分53秒
 4
 5 #include<vector>
 6 #include<list>
 7 #include<map>
 8 #include<set>
 9 #include<deque>
10 #include<stack>
11 #include<bitset>
12 #include<algorithm>
13 #include<functional>
14 #include<numeric>
15 #include<utility>
16 #include<sstream>
17 #include<iostream>
18 #include<iomanip>
19 #include<cstdio>
20 #include<cmath>
21 #include<cstdlib>
22 #include<cstring>
23 #include<ctime>
24 #define LL long long
25 #define maxn 4005
26 using namespace std;
27 int dp[maxn][maxn];
28 int pre[maxn][maxn];
29 int a[maxn];
30 int hs[1000005];
31 int main(){
32     int n ;
33     scanf("%d",&n);
34     for(int i = 1;i <= n;i ++)
35     {
36          scanf("%d",&a[i]);
37     }
38     for(int i = 1;i <= n;i ++)
39     {
40          for(int j = i+1 ;j <= n  ;j ++)
41          {
42               pre[i][j] = hs[a[j]];
43          }
44          hs[a[i]] = i ;
45     }
46     memset(dp,0,sizeof(dp));
47     int ans = 1 ;
48     for(int i = 1;i<=n;i ++)
49     {
50        dp[i][0] = 1;
51        for(int j = 1;j < i;j ++)
52        {
53           dp[i][j] = dp[j][pre[j][i]] + 1;
54           ans = max(ans,dp[i][j]);
55        }
56     }
57     printf("%d\n",ans);
58 return 0;
59 }

时间: 2024-10-22 03:47:40

Codeforces 156C Almost Arithmetical Progression的相关文章

最近做的DP类题的总结~

感觉自己DP确实太弱... Codeforces Round #156 (Div. 1) A. Almost Arithmetical Progression 题意:在保持循序的情况下,从一个数组取出最多的数,这些数是交替出现的,例如,1,2,1,2,... dp[i][j] 表示前i 个数,第 j 个数和第 i 个数被取出可以组成最长序列 我们用pre[i]记录 i 上一次出现的位置,这样就可以好好转移了... #include<cstdio> #include<cstring>

CodeForces 567C. Geometric Progression(map 数学啊)

题目链接:http://codeforces.com/problemset/problem/567/C C. Geometric Progression time limit per test 1 second memory limit per test 256 megabytes input standard input output standard output Polycarp loves geometric progressions very much. Since he was on

map Codeforces Round #Pi (Div. 2) C. Geometric Progression

题目传送门 1 /* 2 题意:问选出3个数成等比数列有多少种选法 3 map:c1记录是第二个数或第三个数的选法,c2表示所有数字出现的次数.别人的代码很短,思维巧妙 4 */ 5 /************************************************ 6 * Author :Running_Time 7 * Created Time :2015-8-6 1:07:18 8 * File Name :C.cpp 9 *************************

Codeforces Round #392 (Div. 2) F. Geometrical Progression

原题地址:http://codeforces.com/contest/758/problem/F F. Geometrical Progression time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standard output For given n, l and r find the number of distinct geometrical pro

CodeForces 567C Geometric Progression

Geometric Progression Time Limit:1000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice CodeForces 567C Description Polycarp loves geometric progressions very much. Since he was only three years old, he loves only t

Codeforces Round #Pi (Div. 2)——map——Geometric Progression

Polycarp loves geometric progressions very much. Since he was only three years old, he loves only the progressions of length three. He also has a favorite integer k and a sequence a, consisting of n integers. He wants to know how many subsequences of

Codeforces 567C - Geometric Progression - [map维护]

题目链接:https://codeforces.com/problemset/problem/567/C 题意: 给出长度为 $n$ 的序列 $a[1:n]$,给出公比 $k$,要求你个给出该序列中,长度为 $3$ 的等比子序列的数目. 题解: 首先倒着遍历,用map记录曾经出现过的每个数字的出现次数,然后再用另一个map来记录曾经出现过的所有满足 $(x,kx)$ 的二元组的数目,最后就直接维护答案即可. AC代码: #include<bits/stdc++.h> #define IO (i

CodeForces 567C Geometric Progression 类似dp的递推统计方案数

input n,k 1<=n,k<=200000 a1 a2 ... an 1<=ai<=1e9 output 数组中选三个数,且三个数的下标严格递增,凑成形如b,b*k,b*k*k的种数 做法:先将可以作为第三个数的数放到map中,然后再扫一遍依次统计map中的数作为第三个数的种数,第二个数的种数,第三个数的种数 1 #include<cstdio> 2 #include<map> 3 struct node 4 { 5 int b;//a[i]作为i1的

Codeforces Round #Pi (Div. 2) —— C-Geometric Progression

题意: 现在有n个数,然后给出一个数k(代表的是等比数列中的那个公比),然后第二行给出n个数,代表的是这个序列. 最后的问题是叫你找出在这个序列中满足公比为k的三个数有几种,并输出方案总数. 思路: 这道题很巧妙啊,用到了map. 首先我们先记录下每种数出现过了几次,这里因为数太大了,直接用数组存会爆掉,所以改用map. 我们需要两个map,分别记为mp1,mp2. 然后在for的过程中,我们是以当前的那个数为第二项,然后去寻找它的mp1[a[i]*k](也就是第三项),寻找它的mp2[a[i]