题目传送门OpenJ_Bailian 4103

描述

有一个方格矩阵,矩阵边界在无穷远处。我们做如下假设:
a.    每走一步时,只能从当前方格移动一格,走到某个相邻的方格上;
b.    走过的格子立即塌陷无法再走第二次;
c.    只能向北、东、西三个方向走;
请问:如果允许在方格矩阵上走n步,共有多少种不同的方案。2种走法只要有一步不一样,即被认为是不同的方案。


输入

允许在方格上行走的步数n(n <= 20)

输出

计算出的方案数量

样例输入

2

样例输出

7

解题思路:

   1.递归:从 (i,j) 出发,走n步的方案数,等于以下三项之和:

       从(i+1,j)出发,走n-1步的方案数。前提:(i+1,j)还没走过

    从(i,j+1)出发,走n-1步的方案数。前提:(i,j+1)还没走过

    从(i,j-1)出发,走n-1步的方案数。前提:(i,j-1)还没走过

       逐层往下搜。

    或者用状态转移:

    要是最后一步是向左走,则前一步不能为向右走      l[i]=l[i-1]+u[i-1]

    要是最后一步是向右走,则前一步不能为向左走   r[i]=r[i-1]+u[i-1]

    要是最后一步是向上走,则前一步是什么无影响   u[i]=l[i-1]+r[i-1]+u[i-1]

可得公式:f[i]=l[i]+r[i]+u[i]
               =2*l[i-1]+2*r[i-1]+3*u[i-1]
               =2*f[i-1]+u[i-1]
               =2*f[i-1]+f[i-2]

#include<cstdio>
int vis[][]= {};
int ways(int x,int y,int n)
{
if (n==)
return ;
vis[x][y]=;
int num=;
if (!vis[x][y-]) num+=ways(x,y-,n-);
if (!vis[x][y+]) num+=ways(x,y+,n-);
if (!vis[x+][y]) num+=ways(x+,y,n-);
vis[x][y]=;
return num;
}
int main()
{
int n;
scanf("%d",&n);
printf("%d\n",ways(,,n));
return ;
}

递归搜索

#include<cstdio>
int l[],r[],u[];
int main()
{
int n;
scanf("%d",&n);
l[]=r[]=u[]=;
for (int i=; i<=n; i++)
{
l[i]=l[i-]+u[i-];
r[i]=r[i-]+u[i-];
u[i]=l[i-]+r[i-]+u[i-];
}
printf("%d\n",l[n]+u[n]+r[n]);
return ;
}

DP

#include<stdio.h>
int f[];
int main()
{
int n;
scanf("%d",&n);
f[]=,f[]=;
for (int i=; i<=n; i++)
f[i]=*f[i-]+f[i-];
printf("%d\n",f[n]);
return ;
}

公式

OpenJ_Bailian 4103 踩方格(搜索 动态规划 )的更多相关文章

  1. poj 4982 踩方格

    4982:踩方格 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 有一个方格矩阵,矩阵边界在无穷远处.我们做如下假设:a.    每走一步时,只能从当前方格移 ...

  2. 踩方格 OpenJ_Bailian - 4103

    有一个方格矩阵,矩阵边界在无穷远处.我们做如下假设:a.    每走一步时,只能从当前方格移动一格,走到某个相邻的方格上:b.    走过的格子立即塌陷无法再走第二次:c.    只能向北.东.西三个 ...

  3. 百练4103:踩方格(DFS)

    描述 有一个方格矩阵,矩阵边界在无穷远处.我们做如下假设:a.    每走一步时,只能从当前方格移动一格,走到某个相邻的方格上:b.    走过的格子立即塌陷无法再走第二次:c.    只能向北.东. ...

  4. 递归 dfs 记忆化搜索 动态规划

    今天做洛谷P1434 [SHOI2002]滑雪 的时候仔细想了想记忆化搜索 现在总结一下 为了描述问题的某一状态,必须用到该状态的上一状态,而描述上一状态,又必须用到上一状态的上一状态……这种用自已来 ...

  5. noip 邮票面值设计 - 搜索 - 动态规划

    描述 给定一个信封,最多只允许粘贴N张邮票,计算在给定M(N+M<=10)种邮票的情况下(假定所有的邮票数量都足够),如何设计邮票的面值,能得到最大max ,使得1-max之间的每一个邮资值都能 ...

  6. DFS——>记忆化搜索——>动态规划

    以洛谷P1802  5倍经验日 为例 https://www.luogu.org/problem/show?pid=1802 题目背景 现在乐斗有活动了!每打一个人可以获得5倍经验!absi2011却 ...

  7. [BZOJ1032][P1840] 祖玛 记忆化搜索 动态规划

        描述 Description     某天,小x在玩一个经典小游戏——zumo.zumo游戏的规则是,给你一段长度为n的连续的彩色珠子,珠子的颜色不一定完全相同,但是,如果连续相同颜色的珠子大 ...

  8. P2258 子矩阵 (搜索,动态规划)

    题目链接 Solution 搜索+DP. 刚好把搜索卡死的数据范围... 然后应该可以很容易想到枚举行的情况,然后分列去DP. 行的情况直接全排列即可,复杂度最高 \(O(C_{16}^{8})\). ...

  9. skiing 暴力搜索 + 动态规划

    我的代码上去就是 直接纯粹的  暴力  .   居然没有超时   200ms  可能数据比较小   一会在优化 #include<stdio.h> #include<string.h ...

随机推荐

  1. angularJS $q

    1.$q $q是Angular的一种内置服务,它可以使你异步地执行函数,并且当函数执行完成时它允许你使用函数的返回值(或异常). 2.defer defer的字面意思是延迟, $q.defer()   ...

  2. Educational Codeforces Round 12 B C题、

    B. Shopping 题意:n个顾客,每个顾客要买m个物品,商场总共有k个物品,看hint就只知道pos(x)怎么算了,对于每一个Aij在k个物品中找到Aij的位置.然后加上这个位置对于的数值,然后 ...

  3. H3C HDLC状态检测

  4. linux mysql 查看默认端口号和修改端口号

    如何查看mysql 默认端口号和修改端口号 2015-03-19 17:42:18 1. 登录mysql [root@test /]# mysql -u root -p Enter password: ...

  5. vue在渲染之前拿到数据操作.......vue数据获取

    异步请求数据,但是生命周期函数也是异步的,怎么才能保证渲染之前就能拿到数据呢? 官方给了两种方案, 我们可以在异步获取数据的时候加上一个loading表示现在在获取数据..... 由于ajax是异步操 ...

  6. Python--day31--TCP的长链接

  7. 原生js实现继承

    在多数语言中继承都很重要.JavaScript是一个基于原型的语言,这意味着对象可以直接从其他对象继承.以下列出几种常见的js继承方式. 原型链继承 function Father(){ this.s ...

  8. 深浅Copy的理解

    在python里对对象进行拷贝有三个,即赋值,深拷贝,浅拷贝. 而对象又分为两种,一种是不可变对象(字符串.元组.数字 ),一种是可变对象(列表.字典). 而深浅拷贝有三种情况:拷贝的是不可变对象.拷 ...

  9. 2018.11.30 浪在ACM 集训队第七次测试赛

    https://blog.csdn.net/StilllFantasy/article/details/84670643 感谢刘凯同学 https://blog.csdn.net/UnKfrozen/ ...

  10. 【Docker】Jenkins的安装与更新

    一.Jenkins安装 1.获取docker镜像 2.查看jenkins版本 3.启动jenkins容器 docker run -d --name jenkins_01 -p 8081:8080 -v ...