藍橋杯 動態規劃 求最大子段和 最大子矩陣和

2021-08-15 02:37:50 字數 1751 閱讀 6209

問題鏈結:hdu1003 max sum。

問題簡述:參見上述鏈結。

問題分析:計算最大子段和問題,是乙個經典的動態規劃問題。

關鍵思路:如果上一次的子段和+當前遍歷到的這個元素數值《當前遍歷到的這個元素數值(其實也就是上次的sum<0),那麼你上一次的子段和就拖累了當前元素,就應把sum新設為當前元素值,讓當前元素去開始它的新天地。若》,則幫助了當前元素,就把當前元素並到上次sum中繼續前進。

#include 

using

namespace

std;  

intmain()  

cout << "case "

<< i << 

":"<< endl;  

cout << max << " "

<< maxstart << 

" "<< maxend << endl;  

if(i != t)  

cout << endl;  

}  return

0;  

}【求最大子矩陣和】

問題描述

給定乙個n*m的矩陣a,求a中的乙個非空子矩陣,使這個子矩陣中的元素和最大。

其中,a的子矩陣指在a中行和列均連續的一塊。

輸入格式

輸入的第一行包含兩個整數n, m,分別表示矩陣a的行數和列數。

接下來n行,每行m個整數,表示矩陣a。

輸出格式

輸出一行,包含乙個整數,表示a中最大的子矩陣中的元素和。

樣例輸入

3 3

-1 -4 3

3 4 -1

-5 -2 8

樣例輸出

10樣例說明

取最後一列,和為10。

資料規模和約定

對於50%的資料,1<=n, m<=50;b

對於100%的資料,1<=n, m<=500,a中每個元素的絕對值不超過5000。

問題分析

這是乙個計算最大子矩陣和的問題。

可以將該問題轉化為計算最大子段和問題,是乙個經典的動態規劃問題。

大致思路

和上一題的相同點在於都用了乙個

「拖累」思想

,也就是動態規劃的狀態轉移的靈活應用。

不同點在於它是要求子「矩陣」和,長寬未知要遍歷——即,起點行和終點行未知要遍歷,起點列和終點列未知要遍歷。s陣列是用來記錄起點行到終點行的每一豎條的數值和的,dp[k]是用來記錄不同的子矩陣和的(需要相鄰豎條相加),maxsum是用來儲存最大sum值的。

每一次變換起點行,s陣列也應重新初始化為0。

#include 

#include 

using

namespace

std;    

inta[510][510],s[510],dp[510];  

intmain()  

}  for(i=1;i<=n;i++)  //起點行

else

if(dp[k]>max)  

}  }  }  

cout << max;  

return

0;  

}   

動態規劃 最大子段和

給定乙個陣列a a0,a1,a2,an 求陣列中 連續子段之和 的最大值。1 最簡單的演算法 窮舉法 計算所有的連續子段之和,得出最大值 窮舉法 計算所有的子串行和 o n 3 public static int maxsum1 int data max tmp max tmp max return...

動態規劃 最大子段和

題目描述 給出一段序列,選出其中連續且非空的一段使得這段和最大。輸入輸出格式 輸入格式 第一行是乙個正整數nn,表示了序列的長度。第二行包含n個絕對值不大於10000的整數a i,描述了這段序列。輸出格式 乙個整數,為最大的子段和是多少。子段的最小長度為1。輸入輸出樣例 輸入樣例 1 72 4 3 ...

動態規劃 最大子段和

動態規劃 最大子段和 lyk喜歡幹一些有挑戰的事,比如說求區間最大子段和。它知道這個題目有o n 的做法。於是它想加強一下。也就是說,lyk一開始有n個數,第i個數字是ai,它找來了乙個新的數字p,並想將這n個數字中恰好乙個數字替換成p。要求替換後的最大子段和盡可能大。lyk知道這個題目仍然很簡單,...