| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1296 人关注过本帖
标题:求助一道题目
取消只看楼主 加入收藏
bytton
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2018-12-19
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
求助一道题目
题目如下:
有T 个case ,每个 case 给出一个长度为n 的原数组f[]。从中选出 k 个值组成一个新的数组a[],满足如下规律:
1、    a[i]>0;
2、    当i>2时,a[i]=a[i-1]+a[i-2];
现在要求出最大的 k;
输入格式:
第一行输入一个T, 表示case 的数量。
接下来每两行表示一个case
每个case 第一行有1个数n,表示原数组长度
接下来一行有n个数f[i],对应原数组中的元素

数据规模:
1 <= T <= 302
1 <= n <= 200
0 <= ai <= 10^9
∑n <= 30000

输出格式:
输出T行, 每行1个整数表示最大的k。
输入样例:
3
3
1 2 3
7
6 5 4 3 2 1 1
1
123456
输出样例:
3
5
1
搜索更多相关主题的帖子: case 数组 输入 表示 输出 
2018-12-19 10:35
bytton
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2018-12-19
收藏
得分:0 
程序代码:
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
int f[210];
int dp[210][210];
int BinarySearch(int a[], int L, int R, int tgt)
{
    int Mid;
    while (L<=R)
    {
        Mid = L+(R-L)/2;
        if (a[Mid]==tgt)
        {
            return Mid;
        }
        else if (a[Mid]>tgt)
            R = Mid-1;
        else
            L = Mid+1;
    }
    return -1;
}
int main(void)
{
    //freopen("haha.txt","r", stdin);
    int T;
    scanf("%d", &T);
    while (T--)
    {
        memset(f, 0, sizeof(f));
        memset(dp, 0, sizeof(dp));
        int n, tmax = 2;
        scanf("%d", &n);
        for (int i=0; i<n; ++i)
        {
            scanf("%d", &f[i]);
            if (f[i]<=0)
            {
                i--, n--;
            }
        }
        if (n<=2)
        {
            printf("%d\n", n);
            continue;
        }
        sort(f, f+n);
        for (int i=0; i<n; ++i)
        {
            for (int j=i+1; j<n; ++j)
            {
                dp[i][j] = 2;
            }
        }
        for (int i=0; i<n; ++i)
        {
            for (int j=i+1; j<n; ++j)
            {
                int k = BinarySearch(f, 0, n-1, f[i]+f[j]);
                if (k==-1) continue;
                else
                {
                    if (dp[j][k]<dp[i][j]+1)
                        dp[j][k] = dp[i][j]+1;
                    if (tmax<dp[j][k])
                        tmax = dp[j][k];
                }
            }
        }
        printf("%d\n", tmax);
    }
    return 0;
}

这是我的代码,但是过不了OJ。请求支援
2018-12-19 10:37
bytton
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2018-12-19
收藏
得分:0 
回复 3楼 rjsp
学校内部题,网上搜不到的
2018-12-19 13:29
bytton
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2018-12-19
收藏
得分:0 
回复 3楼 rjsp
版主,能简单讲解下么,不太看得懂你的代码
2018-12-19 13:43
bytton
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2018-12-19
收藏
得分:0 
这个我也想到了,我想问一下,我上面的那个动态规划代码有什么问题吗?
2018-12-19 14:42
快速回复:求助一道题目
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018225 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved