(dp)CF 813 Educational Codeforces Round 22 D. Two Melodies

D. Two Melodies
time limit per test
2 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output

Alice is a beginner composer and now she is ready to create another masterpiece. And not even the single one but two at the same time!

Alice has a sheet with n notes written on it. She wants to take two such non-empty non-intersecting subsequences that both of them form a melody and sum of their lengths is maximal.

Subsequence is a sequence that can be derived from another sequence by deleting some elements without changing the order of the remaining elements.

Subsequence forms a melody when each two adjacent notes either differs by 1 or are congruent modulo 7.

You should write a program which will calculate maximum sum of lengths of such two non-empty non-intersecting subsequences that both of them form a melody.

Input

The first line contains one integer number n (2 ≤ n ≤ 5000).

The second line contains n integer numbers a1, a2, ..., an (1 ≤ ai ≤ 105) — notes written on a sheet.

Output

Print maximum sum of lengths of such two non-empty non-intersecting subsequences that both of them form a melody.

Examples
input
4
1 2 4 5
output
4
input
6
62 22 60 61 48 49
output
5
Note

In the first example subsequences [1, 2] and [4, 5] give length 4 in total.

In the second example subsequences [62, 48, 49] and [60, 61] give length 5 in total. If you choose subsequence [62, 61] in the first place then the second melody will have maximum length 2, that gives the result of 4, which is not maximal.

 

思路见代码注释。

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <cstdio>
 6 #include <cmath>
 7 #include <queue>
 8 #include <set>
 9 #include <map>
10 #include <list>
11 #include <vector>
12 #include <stack>
13 #define mp make_pair
14 //#define P make_pair
15 #define MIN(a,b) (a>b?b:a)
16 //#define MAX(a,b) (a>b?a:b)
17 typedef long long ll;
18 typedef unsigned long long ull;
19 const int MAX=5e3+5;
20 const int MAX_V=1e3+5;
21 const ll INF=4e18+5;
22 const double M=4e18;
23 using namespace std;
24 const int MOD=1e9+7;
25 typedef pair<ll,int> pii;
26 const double eps=0.000000001;
27 #define rank rankk
28 int dp[MAX][MAX];//dp[i][j]表示第一个序列中最后一个取i,另一个序列最后一个取j的最大长度
29 int maxmod[10],maxnum[(int)(1e5+5)];//分别记录i一定,进行到当前j时,模7为若干或a[x]=多少时最大的dp[i][?]
30 int a[MAX];
31 int n,an;
32 int main()
33 {
34     scanf("%d",&n);
35     for(int i=1;i<=n;i++)
36         scanf("%d",&a[i]);
37     for(int i=0;i<=n;i++)//枚举第一个序列的情况
38     {
39         memset(maxmod,0,sizeof(maxmod));
40         memset(maxnum,0,sizeof(maxnum));
41         for(int j=1;j<=n;j++)
42         {
43             if(i==j)
44                 dp[i][j]=0;//i=j构不成两个非空不重合的序列,故为0
45             else
46             {
47                 int mod=a[j]%7;
48                 if(i>j)//i>j的情况转化为已算过的j<i
49                 {
50                     maxmod[mod]=max(maxmod[mod],dp[i][j]);
51                     maxnum[a[j]]=max(maxnum[a[j]],dp[i][j]);
52                     continue;
53                 }
54                 dp[i][j]=max(maxmod[mod]+1,maxnum[a[j]-1]+1);//前一个为mod7同余 或 前一个为a[j]-1 的比较
55                 dp[i][j]=max(dp[i][j],maxnum[a[j]+1]+1);//与前一个为a[i]+1的比较
56                 dp[i][j]=max(dp[i][j],dp[i][0]+1);//新起一个序列
57                 dp[j][i]=dp[i][j];
58                 maxmod[mod]=max(maxmod[mod],dp[i][j]);
59                 maxnum[a[j]]=max(maxnum[a[j]],dp[i][j]);
60                 an=max(an,dp[i][j]);
61             }
62         }
63     }
64     printf("%d\n",an);
65     return 0;
66 }

 

posted @ 2017-06-07 13:58  perplex  阅读(363)  评论(0编辑  收藏  举报