1. 程式人生 > >Laoj P1197 簡單的方格取數

Laoj P1197 簡單的方格取數

style 最大 題目 背景 其中 數字0 table pac 描述

問題背景
動態規劃入門-第16題
試題描述
設有N*N的方格圖(N<=200,我們將其中的某些方格中填入正整數,而其他的方格中則放入數字0。如下圖所示(見樣例):
A
0 0 0 0 0 0 0 0
0 0 13 0 0 6 0 0
0 0 0 0 7 0 0 0
0 0 0 14 0 0 0 0
0 21 0 0 0 4 0 0
0 0 15 0 0 0 0 0
0 14 0 0 0 0 0 0
0 0 0 0 0 0 0 0 B

某人從圖的左上角的A 點出發,可以向下行走,也可以向右走,直到到達右下角的B點。在走過的路上,他可以取走方格中的數(取走後的方格中將變為數字0)。
此人從A點到B 點,試找出這樣的路徑,使得取得的數之和為最大。
輸入格式
輸入的第一行為一個整數N(表示N*N的方格圖),接下來的每行有三個整數,前兩個表示位置,第三個數為該位置上所放的數。一行單獨的0表示輸入結束。
輸出格式
只需輸出一個整數,表示路徑上取得的最大的和。
輸入示例
8
2 3 13
2 6 6
3 5 7
4 4 14
5 2 21
5 6 4
6 3 15
7 2 14
0 0 0
輸出示例
36
時間限制
1s

【分析】

依舊dp入門,題目說得很清楚啦,“簡單”的方格取數,因為只能向下和向右走,所以dp一遍就行了。

【代碼】

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4
int a[205][205], n, dp[205][205]; 5 6 void init() { 7 int x, y, z; 8 cin >> n; 9 while (cin >> x >> y >> z) { 10 if (!x && !y && !z) 11 break; 12 a[x][y]=z; 13 } 14 return; 15 } 16 17 void sovle() { 18 for
(int i=1;i<=n;++i) 19 for (int j=1;j<=n;++j) 20 dp[i][j]=max(dp[i][j], max(dp[i-1][j]+a[i][j], dp[i][j-1]+a[i][j])); 21 cout << dp[n][n] << endl; 22 return; 23 } 24 25 int main() { 26 init(); 27 sovle(); 28 return 0; 29 }

Laoj P1197 簡單的方格取數