传送门

分析

一眼看去我们自然会想到dp[i][j][k]表示区间[i,j]中选k个子段的最大值。然后我们考虑降去一维。我们设dp[i][j]表示考虑了前i个数,在选了a[i]的情况下共有j个子段的最大值,于是可以列出转移方程式dp[i][j]=Max{dp[i-1][j],Max{dp[k][j-1](k<i)}}+a[i],但是我们发现空间和时间都会爆炸,空间问题我们可以用滚动数组来进行解决,而对于时间问题我们可以记录一个dpmax[i][j]表示Max{dp[k][j](k<=i)}的值,注意这个dpmax数组同样也要滚动,于是我们就可以将转移复杂度变到O(1),在适当剪枝就可以AC啦。

代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cctype>
#include<cmath>
#include<cstdlib>
#include<queue>
#include<ctime>
#include<vector>
#include<set>
#include<map>
#include<stack>
using namespace std;
long long dp[][],dpmax[][],a[],cnt,sum;
int main(){
long long n,m,i,j,k;
scanf("%lld%lld",&n,&m);
for(i=;i<=n;i++)scanf("%lld",&a[i]);
long long now=;
for(i=;i<=n;i++){
now^=;
memset(dp[now],,sizeof(dp[now]));
for(j=;j<=min(i,m);j++){
dp[now][j]=max(dp[now^][j],dpmax[now^][j-]);
dp[now][j]+=a[i];
dpmax[now][j]=max(dp[now][j],dpmax[now^][j]);
}
}
printf("%lld\n",dpmax[now][m]);
return ;
}

最新文章

  1. Execel(导出新方法):
  2. Error:The network adaptor could not establish the connection问题的解决办法
  3. Maximum length of a table name in MySQL
  4. PHP本地通过映射,实现多域名访问
  5. java操作excel总结---poi
  6. [听听音乐]when you believe [singer: mariah carey]
  7. HeadFirst设计模式之迭代器模式
  8. 【转】C++ char数组转化为string
  9. django 学习-1
  10. 蓝牙芯片NRF51822入门学习1:时间管理
  11. HDU Computer Transformation1041 题解
  12. String类的一些转换功能(6)
  13. Object-Relational Structural Patterns
  14. 测试APPEND INSERT是否产生UNDO信息的过程
  15. input表单强制大小写
  16. java内存机制和GC垃圾回收机制
  17. linux ssl证书配置(apache)
  18. 解决mysql配置文件my.cnf添加max_connections不生效
  19. Android Studio占用C盘内存
  20. StartCoroutine 和 StopCoroutine

热门文章

  1. BEC listen and translation exercise 12
  2. Linux运维工程师中级面试题
  3. PHP Smarty template for website
  4. JQuery 提供了两种方式来阻止事件冒泡。
  5. mac下安装libpng环境
  6. 服务端缓存页面及IIS缓存设置
  7. Real-Time Rendering (2) - 变换和矩阵(Transforms and Matrics)
  8. Oracle中OEM的启动与关闭
  9. jsp有哪些内置对象?作用分别是什么?
  10. Python 函数之lambda、map、filter和reduce