*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
上一篇: Q_OBJECT