动态规划问题,小白求教。。。

oldwong77 2017-08-23 12:25:03
http://acm.hdu.edu.cn/showproblem.php?pid=1024
【问题描述】----最大M子段和问题
给定由 n个整数(可能为负整数)组成的序列a1,a2,a3,……,an,以及一个正整数 m,要求确定序列 a1,a2,a3,……,an的 m个不相交子段,
使这m个子段的总和达到最大,求出最大和。

小白求教哪里错了,勿喷。。。

#include<iostream>
#include<cstdio>
#include<cstring>
#define N 1010
using namespace std;
/*dp[i][j]指前j项含有i个字段的最大值,并且第i个字段包含a[j]。
那么分为,a[j]单独组成第i个字段,或者a[j]和前面的字符共同组成第i个字段
状态转移方程:dp[i][j]=max{dp[i][j-1]+list[j],dp[i-1][k]+list[j]} && i-1<=k<=j-1
那么最大值就是max(dp[m][j])*/
int dp[N][N],list[N];
int max(int a,int b){return a>b?a:b;}

int main(){
int n,m,i,j,k;
while(scanf("%d%d",&m,&n)!=EOF){
for(i=1;i<=n;i++)
scanf("%d",&list[i]);
memset(dp,0,sizeof(dp));
for(i=1;i<=m;i++){
for(j=i;j<=n;j++)
if(j>i)
{
for(k=i-1;k<=j-1;k++){
dp[i][j]=max(dp[i][j-1]+list[j],dp[i-1][k]+list[j]);
}
}
else{ //i和j相等
dp[i][j]=dp[i-1][j-1]+list[i];
}
}
int sum=0;
for(j=1;j<=n;j++){
sum=max(sum,dp[m][j]);
}
cout<<sum<<endl;
}
return 0;
}
...全文
278 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
自信男孩 2017-08-23
  • 打赏
  • 举报
回复
可以对输入的数据进行一次排序,从大到小排序,然后根据中间值,大于0的数据组成一个段,那么这个段是不是总和最大的段呢

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧