51 Nod 1083 矩阵取数问题(动态规划)
原题链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1083
题目分析:通过读题发现我们只能往右边或者下边走,意味着“不走回头路”,就是说矩阵里面每个位置最多只会经过一次。其实很多地方是“没有机会”经过的。比如我现在在第 行的第
列,不管之前走的路径是什么样子,则它左边和上边的位置都是不可能再走到的。也就是说,我先在在矩阵第
行的第
列,并假设以它为原点把矩阵分成四个“象限”,只有第四象限的位置才有可能从这以后经过 (当然还包括横轴的正半轴)!
假设我们从起点走到终点的过程中经过第 行的第
列某个位置,为了从起点到终点得到的和最大,那么从起点到第
行的第
列这个位置经过的数的和也一定要最大。我们定义集合
是从起点到第
行的第
列的全部路径集合,定义集合
是从第
行的第
列到终点的全部路径集合。那么起点到终点的路径实际上是子路径
∈
和子路径
∈
的连接(注意删掉第
行的第
列这个点,否则走了两次了)。 即所有经过第
行的第
列的路径都可以划分到
和
这两个集合里,而且任何
∈
和子路径
∈
都可以拼接出一条经过第
行的第
列的路径。那么我要选择一条经过
的能得到最大值的路径,显然要选择
集合里路径和最大的
,(其实还要选
集合里和路径和最大的
)。
说了这么多,其实就是想明确一个事:从起点到终点的最优路径上经过了 个点,则这条路径上对应起点到这
个点的子路径也都从起点到该位置的所有路径中和最大的路径。
那么假设我们定义 表示从起点到第
行的第
列的最优路径上的数之和,并假设这个矩阵事个二维数组
(下标从
开始)。我们考虑一下,我们如何才能到
?前一步要么到
, 要么到
,因为有且只有这两个位置能到
,那么怎样才能得到
? 按我们前面说的,如果从起点达到
的最优路径要经过
或者
则,从起点到达
或者
的路径一定也必须是最优的。那么按照我们对
的定义,我们有从起点达到
的最优路径有两种可能:
- 要么
- 要么
我们要取最优,那自然取较大的,因此有 。这样原来要枚举指数条路径,现在对于每个位置只有两种情况啦。有了递推关系还不够,有初值才能求解。那我们看一下
,显然这是在起点,没的选
。那么按照递推式
, 但是我们对
没有定义呀!考虑下实际意义,这表示要么我们从上面到达
,要么从左面到达
。可是上面没有位置过来啊,这种说明没的选。所以我们可以定义
, 同理我们也可以定义
。
那么总结一下我们的递推式:
分析一下这个算法的时间复杂度? 显然是 ,空间复杂度也一样。
代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
const int INFTY = (1 << 29);
int main() {
int n, a[505][505], dp[505][505];
cin >> n;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
cin >> a[i][j];
for (int i = 0; i <= n; i++) {
a[0][i] = INFTY;
a[i][0] = INFTY;
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (i == 1 && j == 1 ) dp[i][j] = a[1][1];
else dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + a[i][j];
}
}
cout << dp[n][n] << endl;
return 0;
}
51 Nod 1083 矩阵取数问题(动态规划)的更多相关文章
- 51Nod 1083 矩阵取数问题 | 动态规划
#include "bits/stdc++.h" using namespace std; #define LL long long #define INF 0x3f3f3f3f3 ...
- 51Nod 1083 矩阵取数问题(矩阵取数dp,基础题)
1083 矩阵取数问题 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下 ...
- 1083 矩阵取数问题(DP)
1083 矩阵取数问题 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走 ...
- 51nod 1083 矩阵取数问题【动态规划】
一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下向右走,求能够获得的最大价值. 例如:3 * 3的方格. 1 3 3 2 1 3 2 2 1 能够获得的最 ...
- 51nod 1083 矩阵取数问题
就很简单很简单的dp 只能从右或者从下走 所以 dp方程直接看下面公式吧 反正也不难 #include<bits/stdc++.h> using namespace std; ; in ...
- 51nod 更难的矩阵取数问题(动态规划)
更难的矩阵取数问题 给定一个m行n列的矩阵,矩阵每个元素是一个正整数,你现在 在左上角(第一行第一列),你需要走到右下角(第m行,第n列),每次只能朝右或者下走到相邻的位置,不能走出矩阵.然后再从右下 ...
- 1166 矩阵取数游戏[区间dp+高精度]
1166 矩阵取数游戏 2007年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description [ ...
- 矩阵取数游戏 NOIP 2007
2016-05-31 17:26:45 题目链接: NOIP 2007 矩阵取数游戏(Codevs) 题目大意: 给定一个矩阵,每次在每一行的行首或者行尾取一个数乘上2^次数,求取完最多获得的分数 解 ...
- NOIP2007 矩阵取数游戏
题目描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
随机推荐
- Python pyecharts绘制水球图
一.水球图Liquid.add()方法简介 Liquid.add()方法签名add(name, data, shape='circle', liquid_color=None, is_liquid_a ...
- java 编程基础 Class对象 反射:代理模式和静态代理
生活中的代理 类(对象)代理模式 代理模式是面向对象编程中比较常见的设计模式. 1. 用户只关心接口功能,而不在乎谁提供了功能.上图中接口是 Subject 2. 接口真正实现者是上图的 RealSu ...
- HTML界面监控键盘回车Enter按下并绑定动作
本示例绑定键盘回车键(Enter),触发发送WebSocket消息动作 <script type="text/javascript"> //监控键盘Enter 回车键按 ...
- npm 包发布,自己本机发布,前端内部发布,全网发布
第一步,安装 sinopia npm install -g sinopia 开启终端一: 第二步,启动 sinopia -l 127.0.0.1:4873 开启终端二: cd 到某个指定仓库 mkdi ...
- 【LeetCode】862. Shortest Subarray with Sum at Least K 解题报告(C++)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 队列 日期 题目地址:https://leetcod ...
- 1742 开心的小Q
如果一个数字存在一个约数是完全平方数,那么小Q就认为这个数是有趣的. 小Q喜欢收集有趣的数字,每找到一个有趣的数,小Q就会变得很开心. 小Q发现12是有趣的,18也是有趣的,它们都是36的约数,而在3 ...
- 1370 - Bi-shoe and Phi-shoe
1370 - Bi-shoe and Phi-shoe PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 3 ...
- 【模型推理】量化实现分享三:详解 ACIQ 对称量化算法实现
欢迎关注我的公众号 [极智视界],回复001获取Google编程规范 O_o >_< o_O O_o ~_~ o_O 大家好,我是极智视界,本文剖析一下AC ...
- 「双串最长公共子串」SP1811 LCS - Longest Common Substring
知识点: SAM,SA,单调栈,Hash 原题面 Luogu 来自 poj 的双倍经验 简述 给定两字符串 \(S_1, S_2\),求它们的最长公共子串长度. \(|S_1|,|S_2|\le 2. ...
- CS5265完全替代兼容龙迅LT8711|Type-C/DP1.2 to HDMI2.0方案芯片|CS5265兼容TYPEC手机笔电
龙迅LT8711是一款Type-C/DP1.2 to HDMI2.0方案芯片.LT8711HE是一款高性能Type-C/DP1.2至HDMI2.0转换器,设计用于将USB typec或DP1.2源连接 ...