CF467C George and Job 题解 DP 前缀和

DP 前缀和

题目链接

题意:

给你一个长度为n的序列,让你从这个序列中挑选出k个长度为m的区间,并且任意区间不相交。使得选出的数之和最大,求出这个数。

解法:

很经典的DP模型,我们定义fi,j表示从前i个数选出了j个区间可以取得的最大值,那么答案为:fn,k
根据闫式DP分析法,我们可以按照第i个元素选还是不选来划分。
①不选:结果即为fi1,j
②选:结果即为:fim,j1+aim+1+aim+2+...+ai1+ai
用前缀和优化一下:fim,j1+sisim
两种情况取个max即可。

参考代码

void Showball(){
  int n,m,k;
  cin>>n>>m>>k;
  vector<LL> a(n+1),s(n+1);
  for(int i=1;i<=n;i++){
    cin>>a[i];
    s[i]=s[i-1]+a[i];
  }    
  vector f(n+1,vector<LL>(k+1));

  for(int i=1;i<=n;i++){
    for(int j=1;j<=k;j++){
      f[i][j]=f[i-1][j];
      if(i>=m) f[i][j]=max(f[i][j],f[i-m][j-1]+s[i]-s[i-m]);
    }
  }
  
  cout<<f[n][k]<<endl;
}
posted @   Showball  阅读(9)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示