题目大意:输入一个m,n分别表示成m组,一共有n个数即将n个数分成m组,m组的和加起来得到最大值并输出。
思路:dp+状态压缩
思路见CSDN

代码如下

#include <iostream>
#include <cstdio>
#include <algorithm>
//#include <map>
#include <stack>
#include<cstring>
using namespace std;
int dp[1000010];
int dpp[1000010];
int a[1000010];
int m,n;
int main(){
    while(~scanf("%d %d",&m,&n))
    {
     memset(a,0,sizeof a);
     for(int i=1;i<=n;i++)
     {
      scanf("%d",&a[i]);
  }
  memset(dp,0,sizeof dp);
  memset(dpp,0,sizeof dpp);
  
  int maxn = 0; 
  for(int i=1;i<=m;i++)
  {
   maxn = -0x7fffffff;
   for(int j=i;j<=n;j++)
   {
    dp[j] = max(dp[j-1]+a[j],dpp[j-1]+a[j]);
    dpp[j-1] = maxn;
    maxn = max(maxn,dp[j]); 
   }
  }
  cout<<maxn<<endl;
 }
    
}
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐