P1004 方格取数

题目描述

设有 \(N \times N\) 的方格图 \((N \le 9)\),我们将其中的某些方格中填入正整数,而其他的方格中则放入数字\(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\)点共走两次,试找出\(2\)条这样的路径,使得取得的数之和为最大。

输入格式

输入的第一行为一个整数\(N\)(表示\(N \times N\)的方格图),接下来的每行有三个整数,前两个表示位置,第三个数为该位置上所放的数。一行单独的\(0\)表示输入结束。

输出格式

只需输出一个整数,表示\(2\)条路径上取得的最大的和。

输入输出样例

输入 #1

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

输出 #1

67

说明/提示

NOIP 2000 提高组第四题

【思路】

多维dp

因为n的范围就是小于等于9

非常的小

所以完全可以考虑f(i,j,k,l) 表示状态

i,j表示第一次走到的位置

k,l表示第二次走到的位置

然后可以四重循环枚举

虽然不会爆复杂度

但是有一种很简单的方法可以少枚举一维

因为这两次走的步数都是一样的

所以第一次的步数等于i + j

那么只要知道k,就可以求出l

用i + j - k就可以求出

所以很容易就少枚举了一层循环

然后每个状态都有四种可能的情况

第一次是从左边移过来的,第二次是从上边移过来的

第一次是从左边移过来的,第二次是从左边移过来的

第一次是从上边移过来的,第二次是从上边移过来的’

第一次是从上边移过来的,第二次是从左边移过来的

然后比较这里免得最大值,

如果移动后的点位置相同,那就只加上这一个点的值

如果不同那就加上到达的两个点的值

【完整代码】

#include<iostream>
#include<cstdio> using namespace std;
const int Max = 11;
int f[Max][Max][Max][Max];
int a[Max][Max];
int main()
{
int n;
cin >> n;
int x,y,z;
while(1)
{
cin >> x >> y >> z;
if(x == 0 && y == 0)
break;
a[x][y] = z;
}
for(int i = 1;i <= n;++ i)
{
for(int j = 1;j <= n;++ j)
{
for(int k = 1;k <= n;++ k)
{
int l = i + j - k;
if(l <= 0)
break;
f[i][j][k][l] = max(max(f[i - 1][j][k - 1][l],f[i - 1][j][k][l - 1]),max(f[i][j - 1][k - 1][l],f[i][j - 1][k][l - 1]));
if(i == k && j == l)
f[i][j][k][l] += a[i][j];
else
f[i][j][k][l] += a[i][j] + a[k][l];
}
}
}
cout << f[n][n][n][n] << endl;
return 0;
}

最新文章

  1. js_多个引号的用法
  2. 日期对象-Date
  3. 【和我一起学python吧】初学Python,版本如何选择?
  4. (转)在iOS中使用icon font
  5. redis中5种数据结构的使用
  6. css图片映射
  7. javascript div z-index, input tabindex属性说明
  8. C语言中的%0nd,%nd,%-nd
  9. _GUN_SOURCE宏
  10. 《算法实战策略》-chaper19-队列、栈和双端队列
  11. Android应用开发基础篇(3)-----ListView
  12. SQLite数据库查看工具(免费)
  13. Scala 隐式转换及应用
  14. LeetCode第二十三题-合并n个有序链表
  15. c++数组传参
  16. javascript数组的内置对象Array
  17. 4 Django应用 第3部分(视图部分)
  18. Java Web 项目目录结构
  19. Stanford CS231n实践笔记(课时22卷积神经网络工程实践技巧与注意点 cnn in practise 上)
  20. 11月26日 用seed,预加载种子文件; Case 条件语句。网址的参数如何传递,; Query--自定义scopes

热门文章

  1. Vasya and Shifts CodeForces - 832E (高斯消元)
  2. Spark 系列(十三)—— Spark Streaming 与流处理
  3. 每周分享五个 PyCharm 使用技巧(四)
  4. js 一些有意思的小Demo
  5. Jmeter学习笔记(十五)——常用的4种参数化方式
  6. 0001-代码仓库-mvn
  7. workman 使用心得
  8. 5.kafka API consumer
  9. js基础知识4
  10. PAT1016 &#215; PAT1017