時間限制 記憶體限制
1.00s 128.00mb
題目描述
有一座旅遊城,它的街道成網格狀(如圖).其中東西向的街道是「風景線"、兩旁分布著許多景觀:南北向的街道都是"林萌道",兩旁沒有任何建築物。由於遊客眾多," 風景線」被規定為單行道,遊客在風景線上只能從西走到東,林蔭道上則可以任意行走。
一名遊客將到這座旅遊城旅遊。他根據自己對景觀的喜好給所有的風景線打了分,分值是從 −100 到 +100 的整數,分值越大表示我們的旅遊者越喜歡這條風最線上的景致。顯然這位遊客不可能給這座旅遊城的所有風景線都打負分。
遊客可以從旅遊城的任乙個十字路口開始遊覽,在任乙個十字路口結束遊覽。我們的旅遊者希望一路上遊覽的所有風最線的分值之和能夠盡可能地大。請你寫乙個程式,幫助這位遊客尋找一條最佳的遊覽路線。
輸入格式
第一行是兩個整數m和n ,之間用乙個空格符隔開, m 表示旅遊城南北向林萌道的段數, n 表示東西向風景線的段數,(\(1 \le m \le 100\),\(1 \le n \le 20000\))。
接下來的 mm 行依次給出了由北向南各條風景線的分值資訊。每行有 n−1 個整數,依次表示了自西向東每段風景線的分值。同一行相鄰兩個數之間用乙個空格隔開。
輸出格式
只有一行,含乙個整數,表示你的程式所找到的最佳遊覽路線的總分值。
輸入輸出樣例
輸入3 6
50 47 -36 -30 23
17 19 34 -13 -8
-42 -3 43 34 45
輸出84
看到題解裡很多說最大子段和的,此題的確用到了最大子段和。但我想帶大家一起思考一下為什麼會想到最大子段和,然後再來做題。
首先,題目中說:
遊客在東西向上只能從西走到東,南北向上則可以任意行走。也就是說,在左右方向上我們只能向前走不回頭,而上下方向上可以任意的選擇,選擇一條從左到右走的路線,使得這條路線上的和最大。
1.由於必須從左向右走,所以我們所走的路程必須是連續的。
2.由於是選擇一條風景線,所以每個上下方向上選擇乙個風景。這樣,每一列就化為乙個風景,由此轉換成一段路線。在這段路線中找最短的路線。
綜合兩點,在一條線段中找一段連續的和最大的子段,不就是找最大子段和嘛。
知道了要找最大子段和,事情就好辦多了。但是,我們怎麼來尋找一條能讓我們求最大子段和的線段呢?
換句話說,在上下方向中,我們怎麼選擇我們要**的那個風景點呢?
這裡,我們用到貪心的思路,由於我們要求最大和,上下方向的行走是任意的,也就是我們挑選哪個都可以,我們為什麼不比較一下求乙個 \(max\) 呢?
for(int i=1;i<=m-1;i++)
for(int j=1;j<=n;j++)
f[i]=max(f[i],sz[j][i]);
然後就回到求最大子段和的問題了。我們一般採用dp的解決方法,設f[i]表示以第i個位置的數結尾的最大和,轉移的話
看**:
for(int i=1;i<=m-1;i++)
if(f[i-1]>0)
f[i]+=f[i-1];
如果上乙個位置的值大於零的話,我們就加上,若小於零,加上只會讓我們的答案變得更劣,還不如就只有我們自個兒呢。
由此,就可以解決掉這個題了。
偷偷說句:這個題真的有毒,題目中的例子和樣例給的都不對!!!
ps:好像有人說卡快讀,但我寫了快讀好像沒被卡。
附完整**:
#include#include#include#define inf 0x3f3f3f3f
using namespace std;
int n,m;
int sz[105][20005],f[20005],maxx=-inf;
int read()
int main()
for(int i=1;i<=m-1;i++)
for(int j=1;j<=n;j++)
for(int i=1;i<=m-1;i++)
maxx=max(maxx,f[i]);
} printf("%d",maxx);
return 0;
}
題解 洛谷P5767 NOI1997 最優乘車
題面 一道很經典的最短路模型轉換問題。考慮如何建圖。我們可以發現,對於每一條公交線路,可以將這條線路上 可以到達的兩個點 連一條權值為 1 的邊。獲取一條公交線路上的每乙個點可以使用讀取每乙個字元的方式,注意要先讀取第一行的換行符。然後就是普通的 bfs 求圖的最短路問題了。最後注意特判輸出no和 ...
題解 P3825 NOI2017 遊戲
dfs 2 sat被卡得好開心啊 這道題目乍一看是一道 3 sat 的題目,變數是每個地圖,選擇是車的型別。但要注意乙個事實 除了那d個地圖之外,其它的地圖事實上只有2種選擇。而對於那d個x型地圖,我們可以窮舉假設它是a型或b型,因為a型 b型的合法選擇的並還是x型,所以不影響答案。接下來就是連邊的...
題解 P1712 NOI2016 區間
先按照長度排個序,然後依次新增區間。什麼是新增?設這個區間是 l r l,r 新增就是把al al 1,al 2,a r al,al 1 al 2,ar 都加上1 1 其中ai role presentation style position relative aia i表示第 i i 個位置被幾個...