zoukankan      html  css  js  c++  java
  • 踩方格(动态规划,两种递推)

    描述

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

    输入允许在方格上行走的步数n(n <= 20)输出计算出的方案数量样例输入

    2
    样例输出
    7

    //
    本题给了两种递推的写法 /* 两种方法的思路总结: 都是用步数i作为迭代量 然后考虑每一步和前一步的关系 第一种方法是找出三向点和二向点的关系 第二种方法是找出当前点是由三个方向过来的,这三个方向分别又是由...过来的 再找出递推关系,再推导化简,成功优化为一元状态转移方程 */ ///ps.希望一年后我也能有这么强大的acm能力 //特别感谢蔡军帅的这篇博文让我学会这题 //他的博客:https://blog.csdn.net/qq_40875849/article/details/83053045 #include<bits/stdc++.h> #define ll long long using namespace std; /* 每一个三向的点下一步会生成一个三向的点和两个双向的点 //@3 => @3 +@2 +@2 每一个双向的点下一步会生成一个三向的点和一个双向的点 //@2 => @3 +@2 这个可以画个图理解模拟一下 */ int a3[25];//关于三向点的数组 int a2[25];//关于二向点的数组 int main() { /* 刚刚那个规律是一直成立的,只要按着规律一直递推到 第n步有多少个三向方案和多少个双向方案就好了 */ int n; cin>>n; a2[1]=0; a3[1]=1; for(int i=2;i<=n;i++) { /* 第i步:@3 => 第i+1步:@3 +@2 +@2 第i步:@2 => 第i+1步:@3 +@2 联立两个式子 假如现在走到第i步,现在场上有a个@3和b个@2 那么i+1步时会有a*2+b*1个@2 会有a*1+b*1个@3 */ a2[i]=2*a3[i-1]+a2[i-1]; a3[i]=a3[i-1]+a2[i-1]; } cout<<a3[n]*3+a2[n]*2<<endl; //第n步时,有a3[n]个@3和a2[n]个@2 //@3代表有三种走法,@2代表有两种走法 //直接输出3*a3[n]+2*a2[n]就好了 return 0; } //本题另一种写法 //感谢konjac的博文让我学会这题 //他的博客:https://www.cnblogs.com/konjak/p/5936888.html #include<bits/stdc++.h> using namespace std; int f[25]; int main() { /* 另一种方法是用一元数组递推,虽然说比前一种方法效率更高,但更难掌握 因为状态转移方程不能一眼看出,要靠推出来 附上konjac的推导过程(这里为转载复制!!!) 状态转移方程推导如下—— 设l[i],r[i],u[i]分别为第 i 步向西、东、北的方案数,f[i]为总方案数。 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]//这行很重要,对于下面推导 //每个方向的来源都清除,左边是从左边和下面来 //右边是右边和下面来 //上边可以是左右两边来的也可以是下边来的1 f[i]=l[i]+r[i]+u[i]//f[i]由三个方向组成 =2*l[i-1]+2*r[i-1]+3*u[i-1] //把l[i],r[i],u[i]都替换掉 =2*f[i-1]+u[i-1] //然后还剩一个u[i-1]没替换 =2*f[i-1]+f[i-2] //u[i-1]=l[i-2]+r[i-2]+u[i-2]=f[i-2] 于是代码就非常简单了 */ int n; scanf("%d",&n); f[1]=3, f[2]=7; for (int i=3;i<=n;i++) f[i]=2*f[i-1]+f[i-2]; printf("%d ",f[n]); return 0; }
  • 相关阅读:
    数据分析英国电商——数据分析可视化
    数据分析英国电商——数据预处理部分
    特征工程入门与实践—3 特征增强
    特征工程入门与实践—2 特征理解
    特征工程入门与实践 —1 特征工程简介
    正则表达式匹配
    linux学习笔记
    python深度学习基础
    Linux命令小记1
    AWS S3操作命令
  • 原文地址:https://www.cnblogs.com/zyacmer/p/9898748.html
Copyright © 2011-2022 走看看