51NOD1052 最大M字段和
2024-08-31 10:12:32
分析
一眼看去我们自然会想到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 ;
}
最新文章
- Execel(导出新方法):
- Error:The network adaptor could not establish the connection问题的解决办法
- Maximum length of a table name in MySQL
- PHP本地通过映射,实现多域名访问
- java操作excel总结---poi
- [听听音乐]when you believe [singer: mariah carey]
- HeadFirst设计模式之迭代器模式
- 【转】C++ char数组转化为string
- django 学习-1
- 蓝牙芯片NRF51822入门学习1:时间管理
- HDU Computer Transformation1041 题解
- String类的一些转换功能(6)
- Object-Relational Structural Patterns
- 测试APPEND INSERT是否产生UNDO信息的过程
- input表单强制大小写
- java内存机制和GC垃圾回收机制
- linux ssl证书配置(apache)
- 解决mysql配置文件my.cnf添加max_connections不生效
- Android Studio占用C盘内存
- StartCoroutine 和 StopCoroutine