DP 动态规划 Problem P 1016 不向后走的走路方案数

Problem P  ID:1016

简单题意:在一个无限大的平面,只能向前、向左、向右走,不能向后走,走过的路不能再走。给出走的步数n(n<=20),求总方案数。

解题思路形成过程:设F(n)为走n步的总方案数,a(n)为走n步最后一步为向前走的总数,b(n)为走n步最后一步为向左走或向右走的总数。

可以推出:①F(n)=a(n)+b(n);       (比较显而易见)

②a(n)=a(n-1)+b(n-1);
(第n-1步不管是向前走的还是向左或向右走的都可以在第n步向前走)

③b(n)=2*a(n-1)+b(n-1);    (第n-1步如果是向前走的,那么在第n步既可以向左走,也可以向右走,所以a(n-1)要乘以2;而第n-1步如果是向左走的,则不能向右走,第n-1步向右走的不能向左走,否则道路会塌陷,因此b(n-1)不用乘以2)

④a(n-1)=F(n-2);         (不管第n-2步是如何走的,都可以在第n-1步向前走)

由上述4式可得状态转移方程式:a[i]=2*a[i-1]+a[i-2];

又因:a[0]=3; a[1]=7; 问题便迎刃而解了。

感想:又是一个自己想了很久,画了很久没有解决的问题,还是从网上找的相关算法。不过看了别人的算法很快就理解了,不像上个题还要自己再思考好一会儿。

这个题也同样让我感概万千,会做了以后觉得很简单,但是自己独自面对这种问题时很多应该有的想法并不会萌生,DP啊DP,还是各种递推,各种拆分,各种从后一步往前一步找答案。经验、能力还不足,还需努力,努力刷题。

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int a[21];
void dp()
{
    a[0]=3;
    a[1]=7;
    for(int i=2;i<=19;++i){
        a[i]=2*a[i-1]+a[i-2];
    }
}
int main()
{
    int n;
    scanf("%d",&n);
    dp();
    while(n--)
    {
        int m;
        scanf("%d",&m);
        printf("%d\n",a[m-1]);
    }
    return 0;
}

时间: 2024-12-15 19:51:39

DP 动态规划 Problem P 1016 不向后走的走路方案数的相关文章

DP 动态规划 Problem B 1002 求最长上升子序列的长度

Problem B  ID:1002 简单题意:给出X和Z两个字符串,求最长上升子序列的长度. 解题思路形成过程:利用矩阵.X字符串中的各字符依次作为行标,Z字符串中的各字符依次作为列标. 从第一行第一列开始逐行遍历:如果当前位置对应的两个字符相同,则在这个位置记录"前一行前一列"的对应的数+1: 如果当前位置对应的两个字符不同,则在这个位置记录"此行前一列"和"此列前一行"对应的两个数的最大值. 遍历结束后,最后一行最后一列获得的数便是最长上升

(转)dp动态规划分类详解

dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. ****************************************************************************************** 动态规划(英语:Dynamic programm

POJ1141 Brackets Sequence (dp动态规划,递归)

本文出自:http://blog.csdn.net/svitter 原题:http://poj.org/problem?id=1141 题意:输出添加括号最少,并且使其匹配的串. 题解: dp [ i ] [ j ] 表示添加括号的个数, pos[ i][ j ] 表示 i , j 中哪个位置分开,使得两部分分别匹配. pos [ i ][ j ] 为-1的时候,说明i, j 括号匹配. 初始值置dp [ i ] [ i ]  = 1; 如果只有一个括号,那么匹配结果必然是差1. 首先判断括号是

HDU - 5366 The mook jong (dp动态规划)

The mook jong Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 62    Accepted Submission(s): 40 Problem Description ![](../../data/images/C613-1001-1.jpg) ZJiaQ want to become a strong man, so h

【USACO】DP动态规划小测(一)

{20160927 19:30~21:30} 总分400分,我113.33,稳稳地垫底了......(十分呼应我上面的博客名,hhh~)过了这么多天我才打完所有代码,废话我也就不多说了.不过,虽然时间花费的多,但我觉得我的PG也是“博采众长”了. ------------------------------------------------------------------------------------------------------------------------------

背包DP 方案数---P1832 A+B Problem(再升级)

P1832 A+B Problem(再升级) 题面描述 给定一个正整数n,求将其分解成若干个素数之和的方案总数. 题解 我们可以考虑背包DP实现 背包DP方案数板子题 f[ i ] = f[ i ] + f[ i - a[j] ] f[ j ] 表示数字 j 用若干个素数表示的方案总数 注意 1.线性筛不要写错: 1)not_prime[maxn] maxn>=n   2)memset not_prime 数组之后,0,1初始化不是素数 2.方案数 DP 数组要开 long long 代码 #i

DP 动态规划初识

前面的 HMM 中参数求解, 都会用到动态规划, 全是各种概率公式, 是有一些抽象, 今天决定举个一波简单的栗子, 帮助理解DP 把一个大问题,不断划分为更小的子问题来求解的这种方式, 就是动态规划. 这是最为直观和通俗的理解. DP vs 递归 我之前也是经常把 DP 和递归弄混淆. 递归, 其实就是, 函数调用自身. 在某种程度上来说, 递归和DP有其相似性. 我的理解是, DP 降低了 递归 的时间复杂度, 具体说, DP解决了递归的重复子问题计算(overlap) 问题. 为了说明其问题

树形DP——动态规划与数据结构的结合,在树上做DP

本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是算法与数据结构的第15篇,也是动态规划系列的第4篇. 之前的几篇文章当中一直在聊背包问题,不知道大家有没有觉得有些腻味了.虽然经典的文章当中背包一共有九讲,但除了竞赛选手,我们能理解到单调优化就已经非常出色了.像是带有依赖的背包问题,和混合背包问题,有些剑走偏锋,所以这里不多做分享.如果大家感兴趣可以自行百度背包九讲查看,今天我们来看一个有趣的问题,通过这个有趣的问题,我们来了解一下在树形结构当中做动态规划的方法. 这个问题题意很

(hdu step 2.3.7)下沙的沙子有几粒?(简单DP:求有m个H,n和D,且任意索引上H的个数都要比D的个数多的方案数)

在写题解之前给自己打一下广告哈~..抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下: http://edu.csdn.net/course/detail/209 题目: 下沙的沙子有几粒? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 894 Accepted Submission(s): 505   Problem Descri