HDU1024(最大子段和变式+动态数组)(明天重做)(过一段时间下次看到再重做)

把一个数组分成m段, sum(i1, j1) + sum(i2, j2) + sum(i3, j3) + … + sum(im,jm),求使得上述和最大,ik,jk是连续的jk和ik+1可以不连续动态规划,d[i][j]表示在选取第j个数字的情况下,将前j个数字分成i组的最大和, 则它的值有两种可能①(x1,y1),(x2,y2)…(xi,yi,num[j])②(x1,y1),(x2,y2)…(xi-1,yi-1),…,(num[j]),其中yi-1是第k个数字故:d[i][j]=max(d[.
摘要由CSDN通过智能技术生成

第二天更新:pre[]数组相当于存的上一次(第一维是i-1)的状态中的最大值

https://vjudge.net/problem/HDU-1024#author=SDUProgramming
下次看到重新看看注释

把一个数组分成m段, sum(i1, j1) + sum(i2, j2) + sum(i3, j3) + … + sum(im,
jm),求使得上述和最大,ik,jk是连续的jk和ik+1可以不连续
动态规划,d[i][j]表示在选取第j个数字的情况下,将前j个数字分成i组的最大和, 则它的值有两种可能
①(x1,y1),(x2,y2)…(xi,yi,num[j])
②(x1,y1),(x2,y2)…(xi-1,yi-1),…,(num[j]),其中yi-1是第k个数字
故:d[i][j]=max(d[i][j-1],d[i-1][k])+num[j],其中k=i-1,i,…,j-1
参考:https://blog.csdn.net/pmt123456/article/details/52695470

原题(hdu1024)

东东每个学期都会去寝室接受扫楼的任务,并清点每个寝室的人数。
每个寝室里面有ai个人(1<=i<=n)。从第i到第j个宿舍一共有sum(i,j)=a[i]+…+a[j]个人
这让宿管阿姨非常开心,并且让东东扫楼m次,每一次数第i到第j个宿舍sum(i,j) 问题是要找到sum(i1, j1) + … +
sum(im,jm)的最大值。且ix <= iy <=jx和ix <= jy <=jx的情况是不被允许的。也就是说m段都不能相交。 注:1
≤ i ≤ n ≤ 1e6 , -32768 ≤ ai ≤ 32767 人数可以为负数。。。。(1<=n<=1000000)

本来觉得自己比较聪明,然而发现还是太笨了。
实在做不出来,答案也好不容易看的有点懂了
只能笨鸟先飞,多分析点这种不会的题目,然后记住了
明天重做

#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <vector>

using namespace std;

const int MAXN_try = 100 + 5;
const int MAXN = 1e6 + 5;
int n, m;
int dp_try[MAXN_try][MAXN_try]; //第j个人放在第i组时候的最大值
int dp[MAXN];
int a[MAXN];
int pre[MAXN];
int pre_try[MAXN_try][MAXN_try];
int k;
//未优化
void solve() {
   
    memset(dp_try, 0, sizeof(dp_try));
    for (int i = 1; i <= m; i++) {
    //区间数
        for (int j = i; j <= n; j++) {
   
            int temp = -0x3f3f3f3f;
            for (int k 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值