最大行走路线问题(DP)
在一个NxN的棋盘上,每个格子里有若干个棋子,假设起点为左上角的格子,且每次只能向下或向右走一格,问怎样走才能得到最多的棋子。
这是很简单的递推题了。
因为只能向下或者向右,所以其实我们可以把棋盘看成一颗这样的树(以N=3为例)

起点最上,终点最下,数字即为棋子,只能向下走,要找一条数字总和最大的路线。
这个问题怎么考虑呢,我们可以从头开始推,然后记录起始点到其他所有点的最大值。
先保存第一行到第二行的最大值 再保存第三行,这时中间的有两条路,选择最大那条即可

由此就可得到起始点到任意点的最大距离

由此我们可以知道,从下往上,每个点都是选择上面连接的两个点中,距离最大的那个,然后加上自身的值。
设map[n][n]保存棋盘每个点的棋子数,dp[n][n]保存起始点到每个点的最大距离
即有状态转移方程:
dp[i][j] = dp[i][j-1] + dp[i-1][j] + map[i][j]
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
using namespace std; #define MEM(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define debug printf("!/m")
#define INF 1000
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long LL dp[INF][INF]; LL map[INF][INF]; typedef pair<int,int> pa; stack<pair<int,int> > road; int main()
{
int n,i,j; MEM(map,);
MEM(dp,);; pf("请输入棋盘的维度n\n");
sf("%d",&n); pf("请输入棋盘每个格子里的棋子数\n");
for(i = ;i<=n;i++)
{
for(j = ;j<=n;j++)
{
sf("%lld",&map[i][j]);
}
} for(i = ;i<=n;i++)
{
for(j = ;j<=n;j++)
{
dp[i][j] = max(dp[i-][j],dp[i][j-]) + map[i][j];
}
} road.push(make_pair(n,n));
int a=n,b=n;
for(;;)
{
if(dp[a][b-] >= dp[a-][b])
b = b-;
else
a = a-;
if(a== || b==)
break;
road.push(make_pair(a,b));
} pf("起始点到每个点的最大距离如下\n");
for(i = ;i<=n;i++)
{
for(j = ;j<=n;j++)
{
pf("%lld\t",dp[i][j]);
}
blank;
} pf("得到的最多的棋子为%lld\n",dp[n][n]); pf("路径如下:\n");
while(!road.empty())
{
pa x= road.top();
road.pop();
pf("(%d,%d) ",x.first,x.second);
}
blank; return ;
}
/*
3
1 20 6
9 16 19
13 15 5
*/
最大行走路线问题(DP)的更多相关文章
- 基于WebGL架构的3D可视化平台—实现小车行走路线演示
小车行走路线演示New VS Old 刚接触ThingJS的时候,写的一个小车开进小区的演示,今天又看了教程中有movePath这个方法就重新写了一遍,其中也遇到了一些问题,尤其突出的问题就是小车过弯 ...
- unity 确定敌人行走路线
一开始搞这个问题很头疼,无从下手. 1.敌人在随机地点产生后,每个敌人有要有自己自动的行走路线,目的地是保护地,而且行走路线要多样化. 2.敌人在看到玩家时,改变行走路线,向玩家的方向行进,且到了一定 ...
- 洛谷2747(不相交路线、dp)
要点 反思:以前是在紫书上做过的-- \(dp[i][j]\)是从1引两条路到达i.j的最大值 为了不相交,则\(dp[i][i]\)都是非法的,不转移它,也不用它转移 #include <cs ...
- 洛谷2149 Elaxia的路线(dp+最短路)
QwQ好久没更新博客了,颓废了好久啊,来补一点东西 题目大意 给定两个点对,求两对点间最短路的最长公共路径. 其中\(n,m\le 10^5\) 比较简单吧 就是跑四遍最短路,然后把最短路上的边拿出来 ...
- BZOJ3782 上学路线 【dp + Lucas + CRT】
题目链接 BZOJ3782 题解 我们把终点也加入障碍点中,将点排序,令\(f[i]\)表示从\((0,0)\)出发,不经过其它障碍,直接到达\((x_i,y_i)\)的方案数 首先我们有个大致的方案 ...
- 别人整理的DP大全(转)
动态规划 动态规划 容易: , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ...
- dp题目列表
此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 11 ...
- uva 116 Unidirectional TSP (DP)
uva 116 Unidirectional TSP Background Problems that require minimum paths through some domain appear ...
- 别人整理的dp题目
动态规划 动态规划 容易: 1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 1189, 1208, 1276, 1322, 14 ...
随机推荐
- Vulnhub Acid
1.信息收集 1.1.netdiscover netdiscover -i eth0 -r 192.168.118.0/24 1.2. Nmap nmap -sP -T4 192.168.118.0/ ...
- Usboot V1.68版本
V1.68版本,我的收藏之一 官方的介绍: 市面上现在大多数U盘都支持启动机器的功能,但是要制作启动型U盘,需要进入WIN98,现在很多人机器 上都没有98了吧,呵呵.为了做个启动盘,装一个98,多冤 ...
- JavaScript基础总纲
如果前人种好了树那我们干嘛不去享受阴凉,然后花费时间去为大树的成长进一份力. 我发现一个站点写的很全面写很系统,我总结主要分为一些几个模块: 一,JavaScript 教程(基础) 二,JavaScr ...
- 如何在Cordova Android 7.0.0 以下版本集成最新插件 极光插件为例
前提 Cordova Android 7.0.0开始改变了项目安卓平台的架构.新建一个空项目分别添加Android 6.4.0 和 Android 7.0.0平台: cordova platform ...
- multiprocessor(中)
一.进程同步(锁) 通过之前的学习,我们千方百计实现了程序的异步,让多个任务可以同时在几个进程中并发处理,他们之间的运行没有顺序,一旦开启也不受我们控制.尽管并发编程让我们能更加充分的利用IO资源,但 ...
- PHP错误——Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes)
解释是可用内存已耗尽,这关系到PHP的memory_limit的设置问题. 这里有两种方法解决 1.修改php.ini memory_limit = 128 打开终端输入下列bash命令 cd /pr ...
- Spring Boot入门教程(1)
Spring Boot入门教程(1) 本文将使用Spring Boot一步步搭建一个简单的Web项目来帮助你快速上手. 将要用到的工具 JDK 8 IntelliJ IDEA(Ultimate Edi ...
- java连接SqlServer2012
要用java连接数据库 首先是要通过JDBC驱动 要先去下载一个sqljdbc4.jar,我这里放百度云盘了, 下载地址:链接:http://pan.baidu.com/s/1slJl89B 密码: ...
- python学习,day3:函数式编程,带参数
# coding=utf-8 # Author: RyAn Bi def test(x,y,z): print(x) print(y) print(z) test(y=2,z =3,x=1) #形参与 ...
- 基于Cython和内置distutils库,实现python源码加密(非混淆模式)
起因 python本身只能做混淆,不能加密,多年的商业软件开发经验导致有某种"洁癖"欲望,将py编译打包 尝试 pyinstaller原理是freeze打包pyc文件,利用工具可完 ...