問題鏈結: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知道這個題目仍然很簡單,...