Laoj P1197 簡單的方格取數
阿新 • • 發佈:2017-08-04
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 4int 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 簡單的方格取數