描述沿著卡利姆多北方邊界延展的破碎的海岸,在世界大**之前曾經是暗夜精靈首都艾薩琳的一部分,艾薩拉。惡魔從這個世界被消除,這片土地被撕碎並被大海吞沒,剩下的只有曾經雄偉城市的廢墟。自那以後,這個岩石交錯的島嶼、峭壁懸崖和珊瑚叢生的海洋成為許多傳說**。暗夜精靈們認為這是個被詛咒的地方,連經驗最豐富的船長都從這裡繞行。這裡有巨大的水生物,可怕的暗礁,強大的激流與巨浪。然而傳聞這裡水下有著驚人的寶藏,吸引了一支矮人探險隊前來。矮人們經過多日的探險,終於發現了在乙個水域下面有著未知的寶藏。但是這個海域常常有著激流與巨浪,矮人們不可能把探險艇停下來甚至逆流而上。
這個海域可以被描述為乙個w×l的矩形,分成個乙個個單元格。每個單元格代表的海域下面可能是寶藏,也可能是一塊可怕地礁石。從激流的上游開始,每過1秒探險艇就會被衝往下游的乙個單位。在被衝往下游的過程中,矮人們可以控制方向,選擇他的正前,左前邊,或右前邊的乙個單位。矮人們決定從這個激流的最上游的任意乙個單元格開始向下漂流,每經過乙個單元格就可以取走這個單元格上的寶藏。但是千萬不能碰到礁石,否則他的探險艇會支離破碎。請你安排乙個計畫,算出探險隊最多一共能拿到多少寶藏。
輸入格式
第1行,兩個整數w,l。
接下來的l行,每行w個整數,以「從上游到下游,面朝水流方向從左向右」的順序依次為每個單元格中的寶藏的數目,如果為-1則表示這個單元格是礁石。
輸出格式
乙個整數,表示得到的寶藏。
測試樣例1
輸入
3 5輸出5 1 3
-1 7 -1
5 1 10
4 -1 7
20 10 5
41備註
上游->下游1 2 3 4 5
1 5 -1 5 4 20
2 1 7 1 -1 10
3 3 -1 10 7 5
如上表,探險隊從(1,1)開始,第1秒向右轉一下,被衝到(2,2)。第2秒向左轉一下,被衝到(3,1)。接下來第3秒正前行走,經過(4,1),(5,1),一共拿到5+7+5+4+20=41個單位的寶藏。
資料規模
1<=w<=1000
1<=l<=8000
所有涉及到的數字不會超過32位帶符號整型的範圍
根據題意,可以輕易想到用搜尋或者動態規劃來解決。考慮到資料規模,搜尋應該使用記憶化搜尋。這裡介紹逆推動態規劃演算法。
考慮是從第一行任意位置出發,所以最終狀態是max(f[1][1..w])。
由於只能向前、左前、右前移動,所以每乙個點的狀態由其下方、左下方、右下方轉移過來,所以動態轉移方程為:f[i][j]=max(f[i+1][j],f[i+1][j-1],f[i+1][j+1])+s[i][j],其中需要考慮邊緣的狀態。由於題目中說有障礙,所以將障礙點賦值為-maxlongint即可。
邊緣直接賦值為0即可。
#include#include#include#includeusing namespace std;
int n, m;
int s[8003][1004];
int f[8003][1004];
int main()
} for (i = 1; i <= n; i++)
for (i = (m - 1); i >= 1; i--)
) + s[i][j];
} }j = 0;
for (i = 1; i <= n; i++)
cout << j << endl;
return 0;
}
1264 線段相交
1264 線段相交 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 給出平面上兩條線段的兩個端點,判斷這兩條線段是否相交 有乙個公共點或有部分重合認為相交 如果相交,輸出 yes 否則輸出 no input 第1行 乙個數t,表示輸入的測試數量 1 t 1000 第2 t...
1264 線段相交
1264 線段相交 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 給出平面上兩條線段的兩個端點,判斷這兩條線段是否相交 有乙個公共點或有部分重合認為相交 如果相交,輸出 yes 否則輸出 no input 第1行 乙個數t,表示輸入的測試數量 1 t 1000 第2 t...
1264 積木大賽 (貪心
時間限制 1 sec 記憶體限制 128 mb 提交 62 解決 38 您該題的狀態 未開始 提交 狀態 討論版 春春幼兒園舉辦了一年一度的 積木大賽 今年比賽的內容是搭建一座寬度為n的大廈,大廈可以看成由n塊寬度為1的積木組成,第i塊積木的最終高度需要是hi。在搭建開始之前,沒有任何積木 可以看成...