簡單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