hdu1024(m段子段和最大)
来源:互联网 发布:一生只爱你南风知意txt 编辑:程序博客网 时间:2024/04/28 17:10
链接:点击打开链接
题意:n个数分成m段不相交子段和最大
代码:
#include <stdio.h>#include <stdlib.h>#include <string.h>#include <iostream>#include <algorithm>using namespace std;const int INF=0x3f3f3f3f;int a[1000005],sum[1000005];int dp[2][1000005][2];int main(){ //因为是分成m段,因此和容易想到 int n,m,i,j,tmp; //dp[i][j]为前i个数分成j段的最大和 while(scanf("%d%d",&m,&n)!=EOF){ //但是再每次合并时,需要判断当前数是否选 memset(dp,-INF,sizeof(dp)); //因此需要再加一维记录前一个数的状态 for(i=1;i<=n;i++){ scanf("%d",&a[i]); sum[i]=sum[i-1]+a[i]; } tmp=-INF; dp[0][0][0]=0; for(i=1;i<=n;i++){ if(sum[i-1]+a[i]>a[i]){ dp[i%2][1][1]=sum[i-1]+a[i]; sum[i]=sum[i-1]+a[i]; } else{ sum[i]=a[i]; dp[i%2][1][1]=a[i]; } dp[i%2][1][0]=tmp; //长度是1时就是最大子段和 tmp=max(tmp,sum[i]); for(j=2;j<=m;j++){ if(i<j) break; if(i-1>=j){ //考虑i-1个数能不能分成j份 dp[i%2][j][1]=max(max(dp[(i-1)%2][j-1][0],dp[(i-1)%2][j-1][1]),dp[(i-1)%2][j][1])+a[i]; dp[i%2][j][0]=max(dp[(i-1)%2][j][0],dp[(i-1)%2][j][1]); } else{ dp[i%2][j][0]=-INF; dp[i%2][j][1]=max(dp[(i-1)%2][j-1][0],dp[(i-1)%2][j-1][1])+a[i]; } } } printf("%d\n",max(dp[n%2][m][1],dp[n%2][m][0])); } return 0;}
0 0
- hdu1024 最大M段子段和
- hdu1024(m段子段和最大)
- hdu1024(最大m子段和)
- 最大m子段和HDU1024
- hdu1024 最大m段和 划分dp
- hdu1024 最大M个子段和 Max Sum Plus Plus
- HDU1024 DP的优化 最大M子段和问题
- 经典动态规划——HDU1024 m段子段和的最大值
- hdu1024 Max Sum Plus Plus(M段子序列的最大和)
- HDU1024 最大子段和
- hdu Max Sum Plus Plus(最大m段子段和)
- hdu Max Sum Plus Plus(最大m段子段和)
- NYOJ742 &HDU1024 - Max Sum Plus Plus(最大M子段和)
- hdu1024 最大m子序列和
- HDU 1024 最大m段子段和 Max Sum Plus Plus
- HDU 1024 Max Sum Plus Plus((最大m段子段和))(动态规划经典)
- 【u124】环状最大两段子段和
- HDU 1024 m段子段和最大值 (DP)
- WEB前端开发最佳实践(2)
- 取石子游戏
- C++智能指针管理类
- 程序员读书雷达
- C++静态成员
- hdu1024(m段子段和最大)
- STM32-RTX CMSIS RTOS学习1
- 爬虫
- Litepal初始化数据库问题研究
- 求和∑ ∑
- springmvc 加载WebApplicationContext源码分析
- 二叉搜索树代码
- PHP实现简单数字分页效果
- java中存在的四种引用