HDU ACM 1024(最大子序列和)

本文介绍了一种使用动态规划解决特定序列划分问题的方法。通过二维数组table[i][j]来记录最大值,实现了对序列的有效划分,并给出了完整的C++实现代码。

2维表table[i][j] 表示将序列a1,a2,a3,...中的包含aj在内的j 个数分成i段,能得到的最大值。

So, table[i][j] = table[i][j-1] + aj  , 表示aj 与aj-1 同属同一段。

       若aj与aj-1不再同一段, 则 table[i][j] = max(table[i-1][k]) + aj , (i-1<=k<j)

    求table第i行只需要用第i-1行,所以用动态数组来节省空间。

#include<iostream>
using namespace std;
const int M = 1000000;
long tmp[2][M];
int a[M];
inline long max(long &a ,long &b)
{
    return a>b?a:b;
}
int main()
{
    int m,n,t;

    long max_,res;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        t = 1 ;
        for(int i = 0 ; i < n-m ;i ++)
        {
            cin >> a[i];
            tmp[0][i] = 0;
        }
        for(int i = n-m; i < n ; i ++)
        {
            cin >> a[i];
        }
        for(int i = 0 ; i < m ;i++)        // i=0 的时候表示的是分1块的情况。
        {
            if(i == 0)
            {
                max_ = -32768l;
                tmp[t][0] = a[0];
            }
            else 
            {
                max_ = tmp[1-t][i-1];
                tmp[t][i] = tmp[1-t][i-1]+a[i];
            }
            for(int j = i + 1 ; j <= n-m+i ; j++)
            {

                max_ = max(max_ , tmp[1-t][j-1]);
                tmp[t][j] = max(max_ , tmp[t][j-1]) + a[j];

            }
            t = 1 - t;
        }
        t = 1 - t;
        res = -32768*m;
        for(int i = m-1 ; i < n ; i ++)
        {
            res =max(tmp[t][i],res);
        }
        cout << res << endl;
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值