Laoj P1197 简单的方格取数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laoj P1197 简单的方格取数相关的知识,希望对你有一定的参考价值。

 

问题背景
动态规划入门-第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 简单的方格取数的主要内容,如果未能解决你的问题,请参考以下文章

[网络流24题] 方格取数问题

Luogu_2774 方格取数问题

[luogu2774] [网络流24题] 方格取数问题

2020CSP-J普及组复赛 D.方格取数(number)(简单dp)

codevs1043 方格取数

hihocoder #1617 : 方格取数(dp)