频道栏目
首页 > 资讯 > 其他 > 正文

动态规划 合唱团 网易实习生面试题

18-06-22        来源:[db:作者]  
收藏   我要投稿

题目:有 n 个学生站成一排,每个学生有一个能力值,牛牛想从这 n个学生中按照顺序选取 k名学生,要求相邻两个学生的位置编号的差不超过 d,使得这 k 个学生的能力值的乘积最大,你能返回最大的乘积吗?

输入描述:

每个输入包含1个测试用例。每个测试数据的第一行包含一个整数 n (1<=n<=50),表示学生的个数,接下来的一行,包含n个整数,按顺序表示每个学生的能力值 ai(-50<=ai<= 50)。接下来的一行包含两个整数k 和 d (1 <= k <= 10, 1 <= d <= 50)。

输出描述:

输出一行表示最大的乘积。

输入例子:

3

7 4 7

2 50

输出例子:

49

#include

using namespace std;

inline long long max(long long a,long long b){return a>ba:b;}

inline long long min(long long a,long long b){return aint main()

{

int n,k,d,q;

cin>>n;

long long MAX[51][51],MIN[51][51],a[51],ans=0;

for(int i=1;i<=n;i++)

cin>>a[i];

cin>>k>>d;

for(int i=0;i<=k;i++)

{

for(int j=0;j<=n;j++)

{

MAX[i][j]=0;

MIN[i][j]=0;

}

}

for(int i=1;i<=n;i++)

{

MAX[1][i]=a[i];

MIN[1][i]=a[i];

for(q=2;q<=k;q++)

{

for(int j=i-1;j>0&&i-j<=d;j--)

{

MAX[q][i]=max(MAX[q][i],max(MAX[q-1][j]*a[i],MIN[q-1][j]*a[i]));

MIN[q][i]=min(MIN[q][i],min(MIN[q-1][j]*a[i],MIN[q-1][j]*a[i]));

}

}

ans=max(ans,MAX[k][i]);

}

cout< return 0;

}

相关TAG标签
上一篇:C#跨线程调用控件的代码实例讲解
下一篇:javascript在使用中需要注意的几点
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站