1. 程式人生 > >簡單dp之——m段子序列的最大和

簡單dp之——m段子序列的最大和

題目:hdu1024

題意:m:分成m段。n:陣列長度。給定一個數組求m段子區間的最大和...Now given an integer m (m > 0), your task is to find m pairs of i and j which make sum(i1, j1) + sum(i2, j2) + sum(i3, j3) + ... + sum(im, jm) maximal (ix ≤ iy ≤ jx or ix ≤ jy ≤ jx is not allowed).

解答:dp[i][j]:前j個數分成i組的最大子區間和。

1、狀態轉移方程:dp[i][j] = max(dp[i][j-1] + a[j],max(dp[i-1][k](0 < k < j) ) + a[j])//前者:包含在第i組裡,後者:獨立成第i組

2、優化成一維的。

(1)將i放入外層迴圈當中

(2)如何求max(dp[i-1][k])?

dp[i-1][k]相當於上一輪(i-1)從dp(一維)[i-1]到dp[j-1]中的最大值,用t陣列記錄

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const int MAXN = 1000000 + 100;
const int INF = 0x7fffffff;
int a[MAXN],dp[MAXN],t[MAXN];
int temp,m,n;
int main()
{
    while(~scanf("%d%d",&m,&n))
    {
        for(int i = 1;i <= n;i++)
        {
            scanf("%d",&a[i]);
            t[i] = 0;
            dp[i] = 0;
        }
        t[0] = 0;
        dp[0] = 0;
        for(int i = 1;i <= m;i++)
        {
            temp = -INF;//每進入新的一輪就要初始化為最小以便求該輪的最大值
            for(int j = i;j <= n;j++)
            {
                dp[j] = max(dp[j-1] + a[j],t[j-1] + a[j]);
                t[j-1] = temp;//求完dp[j]再更新
                temp = max(temp,dp[j]);
            }
        }
        int ans = -INF;
        for(int i = m;i <= n;i++)
            if(dp[i] > ans)
                ans = dp[i];
        printf("%d\n",ans);
    }
    return 0;
}


相關推薦

簡單dp——m段子序列

題目:hdu1024 題意:m:分成m段。n:陣列長度。給定一個數組求m段子區間的最大和...Now given an integer m (m > 0), your task is to fi

m段的(動態規劃)

Now I think you have got an AC in Ignatius.L's "Max Sum" problem. To be a brave ACMer, we always challenge ourselves to more difficult problems. Now y

連續子序列問題---python實現

連續子序列最大和問題—python實現 問題:連續子序列最大和 給定一個數字序列[A1A2A3…An],求i,j(1<=i<=j<=n)使得Ai…Aj和最大, 輸出這個最大和(連續大子序列最大和) 例如: 輸入: L=[-2 ,6,

Maximum Subarray連續子序列 -- LeetCode(經典動態規劃)

原題連結: http://oj.leetcode.com/problems/maximum-subarray/這是一道非常經典的動態規劃的題目,用到的思路我們在別的動態規劃題目中也很常用,以後我們稱為”區域性最優和全域性最優解法“。基本思路是這樣的,在每一步,我們維護兩個變數,一個是全域性最優,就是到當前元

連續子序列問題的四種經典解答

問題描述    給定(可能是負的)整數序列A1, A2,...,AN, 尋找(並標識)使Sum(Ak)(k >=i, k <= j)的值最大的序列。如果所有的整數都是負的,那麼連續子序列的最大和是那個最大的負數項。最好給出給出最大和連續子序列!! 1 暴力破

HDU1087 超級跳躍(遞增子序列

Nowadays, a kind of chess game called “Super Jumping! Jumping! Jumping!” is very popular in HDU. Maybe you are a good boy, and know little about this game

動態規劃——連續子序列

題目描述: 輸入一個整型陣列,數組裡有正數也有負數。 陣列中連續的一個或多個整陣列成一個子陣列,每個子陣列都有一個和。 求所有子陣列的和的最大值。要求時間複雜度為O(n)。 例如輸入的陣列為1,

六種姿勢拿下連續子序列問題,附虛擬碼(以HDU 1003 1231為例)

問題描述:       連續子序列最大和,其實就是求一個序列中連續的子序列中元素和最大的那個。       比如例如給定序列:            { -2, 11, -4, 13, -5, -2 }         其最大連續子序列為{ 11, -4, 13 },最大和

HDU 1231 簡單DP欄位

原題地址:http://acm.hdu.edu.cn/showproblem.php?pid=1231 演算法核心: 動態規劃, 陣列為vec[]vec[],設dp[i]dp[i] 是以vec[i]

LeetCode二叉樹深度(簡單 二叉樹)

問題描述: 給定一個二叉樹,找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。 示例: 給定二叉樹 [3,9,20,null,null,15,7], 3 / \ 9 20

動態規劃:ZOJ1074-子矩陣 DP長子序列的升級版)

To the Max Time Limit:1 Second     Memory Limit:32768 KB Problem Given a two-dimensional a

動態規劃longest common subsequence公共子序列

這題相對於longest common substring而言更容易一些,區別就子序列和子串, 串的話每個字母是要連續的,序列的話,不要求,用動態規劃做,遞推公式如下,不難: 上程式碼: public class CommonSubseq { public stat

ZOJ1074 子矩陣 DP連續子序列

 To the Max Time Limit:1 Second     Memory Limit: 32768 KB Problem Given a two-dimensional array of positive and negative integers,

正整數n劃分為m段,求m段的乘積 【區間DP

時間限制:1000 ms  |  記憶體限制:65535 KB 描述 給出兩個整數 n , m ,要求在 n 中加入m - 1 個乘號,將n分成m段,求出這m段的最大乘積 輸入第一行是一個整數T,表

dp - 循環數組的

stream lov sca 長度 spa 時間限制 cto 多個 難度 首尾相連數組的最大子數組和 時間限制:1000 ms | 內存限制:65535 KB 難度:4 描述給定一個由N個整數元素組成的數組arr,數組中有正數也有負數,這個數組不是一般的數組,其首尾是

區間dp的總結(乘積

logs 數組 str 區間dp 方程 style nbsp span 乘號 #include <iostream> #include <cstdio> #include <algorithm> #include <cstrin

dp練習(9)——乘積

flask 在屏幕上 黃金 輸出 scrip ext using 兩種 memset 1017 乘積最大 2000年NOIP全國聯賽普及組NOIP全國聯賽提高組 時間限制: 1 s 空間限制: 128000 KB 題目等級 : 黃金 Gold

左神帶你刷題生成窗口值數值

pack 生成 inf get -i int arr AI OS 題目描述:   有一個整型數組arr和一個大小為w的窗口從數組的最左邊滑到最右邊,窗口每次向右滑動一個位置。 比如 : 給定數組【4 3 5 4 3 3 6 7】 【4 3 5 】4 3 3 6 7

410. Split Array Largest Sum 把數組劃分為m組,怎樣使

sum lar mil 輸入 examples follow font AS height [抄題]: Given an array which consists of non-negative integers and an integer m, you can spli

maximum-subarray 序列連續 貪心

subarray span odin sin pub ive question more pid Find the contiguous subarray within an array (containing at least one number) which has