欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

*HDU1024.Max Sum Plus Plus(DP+滚动数组优化)

程序员文章站 2022-03-08 13:24:51
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024解题思路:dp1[i]表示当前在前i个中选取j个区间的最大值dp2[i]表示在前i个中选取j-1个区间的最大值转移方程:dp1[i]=max(dp1[i-1]+s[i],dp2[i-1]+s[i]); 前部分表示s[i]直接放如前一区间中,后部分表示s[i]单独为一个区间dp2[i]=max(dp1[k]),k#include<...

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1024
解题思路:dp1[i]表示当前在前i个中选取j个区间的最大值
dp2[i]表示在前i个中选取j-1个区间的最大值
转移方程:
dp1[i]=max(dp1[i-1]+s[i],dp2[i-1]+s[i]); 前部分表示s[i]直接放如前一区间中,后部分表示s[i]单独为一个区间
dp2[i]=max(dp1[k]),k<i

#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
int s[1100000];
int dp1[1100000];
int dp2[1100000];
int n,m;
int max(int a,int b){
	return a>b? a:b;
}
int main(){
	while(scanf("%d%d",&m,&n)!=EOF){
		memset(dp1,0,sizeof(dp1));
		memset(dp2,0,sizeof(dp2));
		for(int i=1;i<=n;i++)
			scanf("%d",&s[i]);
		int tmp;
		for(int i=1;i<=m;i++){
			tmp=-99999999;
			for(int j=i;j<=n;j++){
				dp1[j]=max(dp1[j-1]+s[j],dp2[j-1]+s[j]);
				dp2[j-1]=tmp;
				tmp=max(tmp,dp1[j]);
			}
		}
		//printf("%d\n",dp1[n]);
		printf("%d\n",tmp);
	}
	return 0;
}

本文地址:https://blog.csdn.net/littlegoldgold/article/details/107306010