XMU 1605 nc与数列 【动态规划】

1605: nc与数列

Time Limit: 2000 MS  Memory Limit: 64 MB
Submit: 84  Solved: 13
[Submit][Status][Web Board]

Description

nc最近很无聊~所以他总是想各种有趣的问题来打发时间。
nc在地上写了一些数字,他发现有一些有趣的数列:这些数列是非递减的,且从第三个数开始,数字的大小总是前两个数的和。如著名的Fibonacci数列:1 2 3 5 8 13 ...,或者其他满足条件的数列:2 2 4 6 10 16。他现在给你n个数字,想让你从中取出尽量多的数字,对其重新排列后使其满足上述条件,并输出其长度

Input

第一行为N,表示有N个数字,1<=N<=1000
以下有N个数字a1...an,其中0<=ai<=10^9。

Output

一个整数,表示最长有趣数列的长度。

Sample Input

6
6 5 4 3 2 1

Sample Output

4

HINT

我们可以找到许多满足条件的序列:

如:



5 6

2 4 5

1 2 3 5

由于最长的序列为1 2 3 5,故我们只需输出其长度4。

Source

[Submit][Status][Web Board]

题目链接:

  http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1605

题目大意:

  题目给出一些数a[i],求从中取出最多的数,且能够构成下述数列:

  一个非递减数列,且从第三个数开始,数字的大小总是前两个数的和。

  问最多能取出多少数。

题目思路:

  【动态规划】

  先把所有数从小到大排序,f[i][j]表示前i个数,构成数列最后一项为a[j]的最长数列长度。

  转移的时候因为有a[i]和a[j]可以推出再之前的数。

  找上一个数可以用二分但我用了for(因为懒)

 1 /****************************************************
 2       
 3     Author : Coolxxx
 4     Copyright 2017 by Coolxxx. All rights reserved.
 5     BLOG : http://blog.csdn.net/u010568270
 6       
 7 ****************************************************/
 8 #include<bits/stdc++.h>
 9 #pragma comment(linker,"/STACK:1024000000,1024000000")
10 #define abs(a) ((a)>0?(a):(-(a)))
11 #define lowbit(a) (a&(-a))
12 #define sqr(a) ((a)*(a))
13 #define mem(a,b) memset(a,b,sizeof(a))
14 const double EPS=1e-8;
15 const int J=10;
16 const int MOD=100000007;
17 const int MAX=0x7f7f7f7f;
18 const double PI=3.14159265358979323;
19 const int N=1004;
20 const int M=14;
21 using namespace std;
22 typedef long long LL;
23 double anss;
24 LL aans;
25 int cas,cass;
26 int n,m,lll,ans;
27 int a[N];
28 int f[N][N];
29 int main()
30 {
31     #ifndef ONLINE_JUDGE
32     freopen("1.txt","r",stdin);
33 //  freopen("2.txt","w",stdout);
34     #endif
35     int i,j,k;
36     int x,y,z;
37 //  for(scanf("%d",&cass);cass;cass--)
38 //  for(scanf("%d",&cas),cass=1;cass<=cas;cass++)
39 //  while(~scanf("%s",s))
40     while(~scanf("%d",&n))
41     {
42         for(i=1;i<=n;i++)
43             scanf("%d",&a[i]);
44         sort(a+1,a+1+n);
45         if(n<3)
46         {
47             printf("%d
",n);
48             continue;
49         }
50         ans=2;
51         f[1][0]=f[2][0]=1;
52         f[2][1]=2;
53         for(i=3;i<=n;i++)
54         {
55             for(j=i-1;j>=0;j--)
56             {
57                 f[i][0]=1;
58                 f[i][j]=2;
59                 for(k=j-1;k>=0;k--)
60                 {
61                     if(a[j]+a[k]<a[i])break;
62                     if(a[j]+a[k]==a[i])
63                         f[i][j]=max(f[i][j],f[j][k]+1);
64                 }
65                 ans=max(f[i][j],ans);
66             }
67         }
68         printf("%d
",ans);
69     }
70     return 0;
71 }
72 /*
73 //
74   
75 //
76 */
View Code
原文地址:https://www.cnblogs.com/Coolxxx/p/6753205.html