HDU 1024 Max Sum Plus Plus【DP,最大m子段和】
来源:互联网 发布:网络男神 毒药 编辑:程序博客网 时间:2024/05/22 19:57
题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1024
题意:
给定序列,给定m,求m个子段的最大和。
分析:
设
对于每个元素有和前一个元素并在一起构成一个子段,和单独开启一个子段两种可能,状态转移方程
dp[i][j] = max(dp[i][j - 1], dp[i - 1][k]) + a[j] (k >= i - 1 && k <= j - 1)
时间复杂度
接着可以用滚动数组进行空间和时间的优化。
直接开一个数组存储这个
我觉得ans和数组dp,t都应该long long的,发现int也能A。。。
代码:
#include<cstdio>#include<cstring>#include<iostream>>using namespace std;#define sa(a) scanf("%d", &a)#define sal(a) scanf("%I64d", &a)const int maxn = 1e6 + 5, INF = 0x3f3f3f3f;int a[maxn];long long dp[maxn], t[maxn];int main (void){ int n, m; while(~scanf("%d%d", &m, &n)){ memset(dp, 0, sizeof(dp)); memset(t, 0, sizeof(t)); for(int i = 1; i <= n; i++) sa(a[i]); long long ans; for(int i = 1; i <= m; i++){ ans = -INF; for(int j = i; j <= n; j++){ dp[j] = max(dp[j - 1], t[j - 1])+ a[j]; t[j - 1] = ans; ans = max(ans, dp[j]); } } printf("%d\n", ans); } return 0;}/*1 2 2 33 3 -3 -3 -3*/
0 0
- hdu 1024 Max Sum Plus Plus(dp && 最大m子段和)
- HDU 1024 Max Sum Plus Plus[dp](最大m子段和)
- HDU 1024 Max Sum Plus Plus(dp最大m子段和)
- HDU 1024 Max Sum Plus Plus【DP,最大m子段和】
- hdu 1024 最大M子段和 Max Sum Plus Plus(dp)(中等难度)
- hdu 1024 Max Sum Plus Plus (最大m子段和)(经典DP)(转)
- hdu 1024 Max Sum Plus Plus 最大m子段和
- hdu 1024 Max Sum Plus Plus (最大m子段和)
- hdu 1024 Max Sum Plus Plus(最大M子段和)
- hdu 1024 Max Sum Plus Plus(最大m子段和)
- hdu 1024 Max Sum Plus Plus(最大m子段和)
- HDU 1024 Max Sum Plus Plus最大m子段和
- HDU 1024 Max Sum Plus Plus(最大M子段和)
- HDU 1024:Max Sum Plus Plus 经典动态规划之最大M子段和
- hdu 1024 Max Sum Plus Plus(m段最大子列和)
- HDU-1024 Max Sum Plus Plus (最大M子段和问题)
- HDU 1024 Max Sum Plus Plus(最大m子段和)
- hdu1042 Max Sum Plus Plus【最大M子段和】
- hdu-5652 并查集或者二分BFS
- 支持向量机SVM(二)
- 个人网站实现扫码登录asp.net 扫码登录
- jquery uploadify在IE上传报406HttpError
- NumPy学习笔记
- HDU 1024 Max Sum Plus Plus【DP,最大m子段和】
- 一天一排序之“希尔排序(缩小增量排序)”
- 支持向量机SVM(三)
- Otto使用记录
- pandas学习笔记
- UVA 10369 - Arctic NetWork (求最小生成树)
- 支持向量机SVM(四)
- NumPy学习笔记
- C语言实现栈