HUD-1024-Max Sum Plus Plus DP+滚动数组
2015-10-22 22:21
507 查看
题意
给定1-N个数 求m个连续不相交区间的最大值
思路
用DP求解
DP[i][j]表示前j个数分为i块的最大值
可得DP方程
DP[i][j]=max(DP[i][j-1]+a[j],max(DP[i-1][t])+a[j])
DP[i-1][t]表示i-1个分割的最大值
由于数据大 不能用二维数组 改用滚动数组
在i一定情况下 用b[j]表示DP[i][j]
pre[j]表示DP[i-1][t]中的最大值
所以DP方程可以改为:
b[j]=max(b[j-1]+a[j],pre[j-1]+a[j])//
给定1-N个数 求m个连续不相交区间的最大值
思路
用DP求解
DP[i][j]表示前j个数分为i块的最大值
可得DP方程
DP[i][j]=max(DP[i][j-1]+a[j],max(DP[i-1][t])+a[j])
DP[i-1][t]表示i-1个分割的最大值
由于数据大 不能用二维数组 改用滚动数组
在i一定情况下 用b[j]表示DP[i][j]
pre[j]表示DP[i-1][t]中的最大值
所以DP方程可以改为:
b[j]=max(b[j-1]+a[j],pre[j-1]+a[j])//
[code]#include <iostream> #include <cstdio> #include <algorithm> #include <cstdlib> #include <string.h> const int N = 1000005; const int Max = -9999999999; int a ;//数组S int b ;//前J个最大和 带a[j] int pre ;//前J个最大 不带a[j] using namespace std; int main() { long long int m,n; int summax; while(cin>>m>>n) { b[0]=0; memset(pre,0,sizeof(pre)); for(int i=1;i<=m;i++) { summax = Max; for(int j=i;j<=n;j++) { if(i==1) scanf("%d",&a[j]); b[j] = max(b[j-1],pre[j-1])+a[j]; pre[j-1]=summax; summax = max(summax,b[j]);//循环到i++ } } cout<<summax<<endl; } return 0; }
相关文章推荐
- 各大工业机器人品牌大全
- 使用PullToRefresh实现下拉刷新和上拉加载
- 掌握需求过程(二)
- [云快讯]《微软+Dell 打造一体化混合云系统》
- 64位Linux编译cximage手记
- Maven入门指南⑤:使用Nexus搭建Maven私服
- Part03 - (图文)vRealize Automation Center 6.2.1系列之初始化Tenant配置
- android离线环境搭建
- iOS经典讲解之Swift数据类型详解
- Android开发(一)
- C# 从需要登录的网站上抓取数据
- OpenCV 测试代码
- 解决Spring MVC @ResponseBody返回中文字符串乱码问题
- maven依赖关系中Scope的作用
- Linux安装mysql——源码安装
- 单链表的归并和就地逆置
- 【VMCloud云平台】私有云门户第一朵VM云(四)
- android studio导包找不到类
- 机器学习3
- 用cryptico.js实现RSA加密(应对cryptico不支持PEM)