动态规划—Problem P
2016-05-10 18:29
211 查看
动态规划—Problem P
题意
在一无限大的二维平面中,我们做如下假设:
1、每次只能移动一格;
2、不能向后走(假设你的目的地是“向上”,那么你可以向左走,可以向右走,也可以向上走,但是不可以向下走);
3、走过的格子立即塌陷无法再走第二次;
求走n步不同的方案数(2种走法只要有一步不一样,即被认为是不同的方案)。
解题思路
递推。关键是找出递推公式。现在用数组dp
表示走n步的方案数。由题目知,可以向下或向左向右走,这里假设用down
表示向下走的方案数,RL
表示向左右走的方案数;
dp
=down
+RL
,
down
=down[n-1]+RL[n-1];
RL
=down[n-1]*2+RL[n-1];
所以dp
=2*dp[n-1]+down[n-1]===>dp
=2*dp[n-1]+dp[n-2];
得到递推公式为:dp
=2*dp[n-1]+dp[n-2]。
感想
递推公式不好找,需要好好分析。
AC代码
题意
在一无限大的二维平面中,我们做如下假设:
1、每次只能移动一格;
2、不能向后走(假设你的目的地是“向上”,那么你可以向左走,可以向右走,也可以向上走,但是不可以向下走);
3、走过的格子立即塌陷无法再走第二次;
求走n步不同的方案数(2种走法只要有一步不一样,即被认为是不同的方案)。
解题思路
递推。关键是找出递推公式。现在用数组dp
表示走n步的方案数。由题目知,可以向下或向左向右走,这里假设用down
表示向下走的方案数,RL
表示向左右走的方案数;
dp
=down
+RL
,
down
=down[n-1]+RL[n-1];
RL
=down[n-1]*2+RL[n-1];
所以dp
=2*dp[n-1]+down[n-1]===>dp
=2*dp[n-1]+dp[n-2];
得到递推公式为:dp
=2*dp[n-1]+dp[n-2]。
感想
递推公式不好找,需要好好分析。
AC代码
#include<iostream> using namespace std; #define MAX 25 int main() { int dp[MAX]; int C,n; dp[1]=3; dp[2]=7; for(int i=3;i<=20;i++) { dp[i]=dp[i-1]*2+dp[i-2]; } cin>>C; while( C--) { cin>>n; cout<<dp <<endl; } }
相关文章推荐
- Eclipse中从svn检出maven项目,报pom.xml错误,相关包或类不能导入的问题
- EDA事件驱动架构
- ABAP 换行符,TAB KEY 替换方式
- Android中自定义ProgressDialog显示位置
- bash嵌套expect实现交换机的交互式登录实例
- windows还原后,eclipse创建的jsp项目css和js失效的问题
- poj 1733Parity game(map离散+带权并查集)
- 第10,11周 阅读程序写出运行结果 (3)
- 手机游戏上线前的准备
- java synchronized静态同步方法与非静态同步方法,同步语句块
- Directx11学习笔记【十一】 画一个简单的三角形--effect框架的使用
- 日历 日期时间选择器
- 小代码 寻找K个最大的数
- oracle 存储过程循环执行update语句
- Etag 笔记
- Gradle解析
- alibaba的FastJson(高性能JSON开发包)
- 如何实现手机缓存清理的功能
- 一些书籍整理
- C++拷贝构造函数的调用时机,如没有重载等号操作符,需重写使用深拷贝