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

来源:互联网 发布:java技术支持的简历 编辑:程序博客网 时间:2024/05/17 23:32

给出一n个数的整数序列,请你从这个序列中截出k段,每一段都连续,段之间可以不连续,使这k段的所有整数的和最大.

关于输入第一行是两个整数n和k(1<=n<=5000,1<=k<=1000,k<=n) 第二行含n个整数.
关于输出输出采用最优取法时所取出的k段的数值总和.
例子输入
5 21 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;}


原创粉丝点击