概述
题目描述
FJ经常给产奶量高的奶牛发特殊津贴,于是很快奶牛们拥有了大笔不知该怎么花的钱。为此,FJ购置了N(1<=N<=2000)份美味的零食来卖给奶牛们。每天FJ售出一份零食。当然FJ希望这些零食全部售出后能得到最大的收益。
这些零食有以下这些有趣的特性:
-
零食按照1…N编号,它们被排成一列放在一个很长的盒子里。盒子的两端都有开口,FJ每天可以从盒子的任一端取出最外面的一个。
-
与美酒和好吃的奶酪相似,这些零食储存得越久就越好吃。当然,这样FJ就可以把它们卖出更高的价钱。
-
每份零食的初始价值不一定相同。FJ进货时,第i份零食的初始价值为v(i) (1<=v(i)<=1000)。
-
第i份零食如果在被买进后的第a天出售,则它的售价是v(i)*a。
v(i)对应的是从盒子顶端往下的第i份零食的初始价值。FJ告诉了你所有零食的初始价值,并希望你能帮他计算一下,在这些零食全被卖出后,他最多能得到多少钱。
第一份零食在买进后的第1天售出,也就是说此时a=1。以后每过一天,a的值就增加1。
输入
第1行: 一个整数N,表示零食的总数
第2…N+1行: 第i+1行给出了从盒子顶端往下的第i份零食的初始价值v(i)
输出
第1行: 输出一个整数,即FJ在卖完所有零食后的最大可能收益
Code
普通搜索 54分
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,ans,v[2020];
void dfs(int ste,int l,int r,int sum){
if(l==r){
ans=max(ans,sum+v[l]*ste);
return;
}
dfs(ste+1,l+1,r,sum+ste*v[l]);
dfs(ste+1,l,r-1,sum+ste*v[r]);
}
int main(){
scanf("%d",&n);ans=0;
for(int i=1;i<=n;i++)scanf("%d",&v[i]);
dfs(1,1,n,0);
cout<<ans<<endl;
return 0;
}
记忆化搜索 AC
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int n,ans,v[2020],f[2020][2020];
int dfs(int ste,int l,int r){
if(r<l)return 0;
if(f[l][r])return f[l][r];
f[l][r]=max(dfs(ste+1,l+1,r)+ste*v[l],dfs(ste+1,l,r-1)+ste*v[r]);
return f[l][r];
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&v[i]);
dfs(1,1,n);
printf("%d",f[1][n]);
return 0;
}
区间dp AC
第一层循环枚举区间长度,第二层循环枚举左端点。
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,f[2017][2017],v[2017];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&v[i]);
for(int i=1;i<=n;i++)f[i][i]=v[i]*n;//一开始初始化忘记乘以n
for(int i=2;i<=n;i++){
for(int l=1;l<=n;l++){
int r=l+i-1;
if(r>n)break;
f[l][r]=max(f[l][r-1]+v[r]*(n-i+1),f[l+1][r]+v[l]*(n-i+1));
}
}
printf("%dn",f[1][n]);
return 0;
}
最后
以上就是迷路灰狼为你收集整理的1901. 牛的零食的全部内容,希望文章能够帮你解决1901. 牛的零食所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复