浙农大第十九届程序设计竞赛 C-变强的秘药

变强的秘药

https://ac.nowcoder.com/acm/contest/7872/C

变强的秘药

分析

确定这是一个dp,设f[i]为吃完前i个秘药能增加的最大码力值,先写出暴力的转移方程

   memset(f,-0x3f,sizeof(f));f[0]=0;
   for (int i=k;i<=n;i++)
       for (int j=i-k;j>=0;j--)
           f[i]=max(f[i],f[j]+a[i]*a[i-1]*a[i-2]-a[j+1]*a[j+2]*a[j+3]);

可以发现,当我们确定了一个i之后,图片说明 是不变的,如果要求最大,那么图片说明 就得最大。那不就完了吗?我们用一个数组p,令图片说明 ,然后每次更新因为要连续k个要一起吃,所以转移方程
图片说明
同时还有一些细节处理,具体看代码

代码

#include<bits/stdc++.h>

#define R register
#define ll long long
#define inf INT_MAX

using namespace std;

const int N=1e7+10;

int n,k;
ll f[N],a[N],p[N];

int main()
{
    memset(f,-0x3f,sizeof(f));f[0]=0;

    scanf("%d%d",&n,&k);
    for (int i=1;i<=n;i++) scanf("%lld",&a[i]);

    p[0]=-a[1]*a[2]*a[3];
    for (int i=1;i<k;i++) p[i]=p[i-1];
    for (int i=k;i<=n;i++)
    {
        f[i]=a[i]*a[i-1]*a[i-2]+p[i-k];
        p[i]=max(p[i-1],f[i]-a[i+1]*a[i+2]*a[i+3]);
    }

    printf("%lld\n",f[n]);

    return 0;
}
全部评论

相关推荐

10-29 22:30
吉林大学 Java
同专业学长学姐,去互联网大厂的起薪&nbsp;15k+,去国企&nbsp;IT&nbsp;岗的也有&nbsp;12k+,就连去中小厂的都基本&nbsp;13k&nbsp;起步😤&nbsp;我投的传统行业技术岗,拼死拼活拿到&nbsp;1Woffer,本来还挺开心,结果逛了圈牛客直接破防,同是校招生,行业差距怎么就这么大啊!
喵喵喵6_6:应该哪里不对吧,大厂都是20k以上的,10k那种对于985本的学生基本就是点击一下过了笔试就送的,我前两天刚拿了一个11k,笔试完第2天就打电话了,非科班。坏消息是c++岗开这么低真是刷新认知了
校招生月薪1W算什么水平
点赞 评论 收藏
分享
浩浩没烦恼:一二面加起来才一个小时? 我一面就一个小时多了
点赞 评论 收藏
分享
09-13 17:25
亲切的00后在笔试:我也遇到了,所以我早他一步查看图片
点赞 评论 收藏
分享
评论
3
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务