zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    【Java】关于Spring框架的总结 (三)
    【Java】关于Spring框架的总结 (二)
    【Java】关于Spring框架的总结 (一)
    关于各编程语言冒泡排序的实现
    【Java】关于MyBatis框架的总结
    Linux 查看服务器开放的端口号
    网络安全随笔
    Window随笔
    Linux随笔
    Powercli随笔
  • 原文地址:https://www.cnblogs.com/Coolxxx/p/6753205.html
Copyright © 2011-2022 走看看