【动态规划】PG最大和问题

给出一n个数的整数序列,请你从这个序列中截出k段,每一段都连续,段之间可以不连续,使这k段的所有整数的和最大.
 
关于输入
第一行是两个整数n和k(1<=n<=5000,1<=k<=1000,k<=n) 第二行含n个整数.
 
关于输出
输出采用最优取法时所取出的k段的数值总和.
 
例子输入
5 2

1 2 -1 2 1
例子输出
6
提示
此题的时间复杂度应为O(nk)
用动态规划可以方便解此题。

#include<iostream>
#include<algorithm>
using namespace std;
int main(){
	int n,k,number[5005],f[5005][2],g[5005][2];
	cin>>n>>k;
	for(int i=0;i<n;i++)
		cin>>number[i];
	
	for(int i=0;i<n;i++)
	for(int j=0;j<2;j++){
		f[i][j]=0;
		g[i][j]=0;
	}
	
	for(int i=1;i<=k;i++){		
		for(int j=0;j<n;j++){
			f[j][0]=f[j][1];
			g[j][0]=g[j][1];
		}
		int sum=0;
		for(int j=0;j<i;j++)
			sum+=number[j];
		f[i-1][1]=sum;
		g[i-1][1]=sum;
		for(int j=i;j<n;j++){						
			f[j][1]=max(f[j-1][1],g[j-1][0])+number[j];
			g[j][1]=max(f[j][1],g[j-1][1]);
		}
	}
	cout<<g[n-1][1]<<endl;

	//system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值