51nod 1118 机器人走方格:

思路:这是一道简单题,很容易就看出用动态规划扫一遍就可以得到结果,

   时间复杂度O(m*n)。运算量1000*1000 = 1000000,很明显不会超时。

递推式子:dp[i][j] = dp[i-1][j] + dp[i][j-1]。  dp[i][j]表示当规格为i*j  (m = i && n = j)  时本题的结果。

直接上代码:

#include <stdio.h>
#include <string.h>
#define rep(i,o,u) for(int i = o;i <= u; i++)
long long a[][];
int main(){
int n,m;
scanf("%d%d",&n,&m);
memset(a,,sizeof(a));
a[][] = ;
rep(i,,n){
rep(j,,m){
a[i][j] = (a[i][j] + a[i-][j]+a[i][j-])%;
}
}
printf("%d\n", a[n][m]);
return ;
}

51nod 1119 机器人走方格 V2:

分析:这题和上题的不同之处在于数据量变大了。如果还按上题的动态规划。时间复杂度O(m*n)。

   运算量将变成10^6*10^6 = 10^12,很明显会超时。

    

     这时我们需要换一条思路。

     一般没有思路的题我都会去找规律,如果找不出规律一般都是需要用到特殊的数据结构或者自己能力不够。

   这题也不例外,我开始了找规律,我发现1118,也就是上面那个题可以得到这个题的部分数据。

   好吧我们先做个试验把,我修改了一下1118的代码,输出了 m = [2,6] & n = [2,6]范围内的数据如下:

   

   然后惊讶的发现这不就是杨辉三角吗?

   想起杨辉三角的定义就是左边和上面两个值之和。

   我们知道杨辉三角有一个组合数的性质。

   然后我们观察这些数据可以发现dp[i][j] = C(m+n-2,m-1) = C(m+n-2,n-1)。

  

   然后这题就迎刃而解了,转化成了组合数问题。

可是求组合数也有一个问题?因为数字过大所以需要取模,我们知道负数取模需要用到逆元。

如果不知道逆元,就看一下这个:点击这里转到博客

   

然后就可以上代码了:

#include <bits\stdc++.h>
using namespace std;
typedef long long ll;
#define Mod 1000000007 //求逆元模板 begin
ll gcd(ll a,ll b,ll &x,ll &y){
if (b==){
x=,y=;
return a;
}
ll q=gcd(b,a%b,y,x);
y-=a/b*x;
return q;
}
ll ni(ll m,ll n) {
ll x = ,y = ;
gcd(n,m,x,y);
if(y > ) return y;
else return n+y;
} //求逆元模板 end ll C(ll a,ll b){
ll num1 = ,num2 = ; //求组合数的分子
for(int i = a-b+;i <= a; i++){
num1 = (num1*i)%Mod;
} //求组合数的分母
for(int i = ;i <= b; i++){
num2 = (num2*i)%Mod;
} //求 (分子num1/分母num2)%Mod 可以转化为 (num1*num2的逆元)%Mod
//如果想知道逆元的原理可以看一下我写的另一篇博客 http://www.cnblogs.com/zhangjiuding/p/7546158.html
cout << (num1*ni(num2,Mod))%Mod << endl;
}
int main() {
int m,n;
cin >> m >> n;
C(m+n-,n-);
return ;
}

51nod 1118 机器人走方格 解题思路:动态规划 & 1119 机器人走方格 V2 解题思路:根据杨辉三角转化问题为组合数和求逆元问题的更多相关文章

  1. 51nod 1119【杨辉三角】

    思路: = =杨辉三角的应用,组合数的应用: C(N+M,N); 逆元一发,费马小定理,OK. #include <stdio.h> #include <string.h> # ...

  2. HDU——1799循环多少次(杨辉三角/动态规划/C(m,n)组合数)

    循环多少次? Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  3. 51nod 1031+斐波那契和杨辉三角的一些基础知识

    直接斐波那契... #include<stdio.h> #include<queue> #include<string.h> #include<iostrea ...

  4. 1119 机器人走方格 V2(组合)

    1119 机器人走方格 V2 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于 ...

  5. 51nod 1119 机器人走方格 V2

    1119 机器人走方格 V2  基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少 ...

  6. 51nod-1119 1119 机器人走方格 V2(组合数学+乘法逆元+快速幂)

    题目链接: 1119 机器人走方格 V2 基准时间限制:1 秒 空间限制:131072 KB    M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于方法数量可能很 ...

  7. 1119 机器人走方格 V2 (组合数学)

    M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于方法数量可能很大,只需要输出Mod 10^9 + 7的结果.   Input 第1行,2个数M,N,中间用空格隔开 ...

  8. 1119 机器人走方格 V2

    1119 机器人走方格 V2 基准时间限制:1 秒 空间限制:131072 KB M * N的方格,一个机器人从左上走到右下,只能向右或向下走.有多少种不同的走法?由于方法数量可能很大,只需要输出Mo ...

  9. OpenJ_Bailian 4103 踩方格(搜索 动态规划 )

    题目传送门OpenJ_Bailian 4103 描述 有一个方格矩阵,矩阵边界在无穷远处.我们做如下假设:a.    每走一步时,只能从当前方格移动一格,走到某个相邻的方格上:b.    走过的格子立 ...

随机推荐

  1. js动态获取时间的方式

    列子的时间是这样实现的."2017/7/25 下午10:27:11 星期二" 列子中有一个div用来放时间. 每隔1s执行一次函数,秒就会变. function showTime( ...

  2. JS源生代码“增删改查”之增

    51呢最近在做一个管理数据的,第一次接触到用JS的源代码去实现一些功能,才知道网页里的许多功能都是依赖于“增删改查”完成的,下面的几张图片就是对于增的演示: 下面是有关HTML的代码:这个主要是弹窗部 ...

  3. html5 canvas元素使用(一)

    html5新增了一个canvas元素,用于在网页上生成一块矩形区域,用于绘制图像,功能非常强大,下面我来简单介绍一下 在页面中添加canvas <canvas id="canvasDe ...

  4. (四)Lua脚本语言入门

    这篇文章就当成铺垫型的文章,写着写着发现有好多想写的,,关于C#与Java,当然作为铺垫肯定与Lua的下部分介绍有关..... 对于"泛型",先看C#中"泛型" ...

  5. MySQL (七)--视图、数据库备份和还原

    1 视图 视图:View,是一种有结构(有行有列)但是没结果(结构中不真实存放的数据)的虚拟表,虚拟表的结构来源不是自己定义,而是从对应的基表中产生(视图的数据来源). 示例脚本: CREATE TA ...

  6. Beta的计划和人员的变动

    一.新的成员和组长是否重选: 刘光华:先加入的一个帅哥,乐于助人,编码基础不是很好,但是有一颗热爱学习的心,会积极主动的完成自己的任务的,一句话宣言:我们的团队是最棒的! 程志铭:做事认真负责,工作脚 ...

  7. 201521123011《Java程序设计》第6周学习总结

    1. 本周学习总结 1.1 面向对象学习暂告一段落,请使用思维导图,以封装.继承.多态为核心概念画一张思维导图,对面向对象思想进行一个总结. XMind 2. 书面作业 1.clone方法 1.1 O ...

  8. 201521123069 《Java程序设计》 第5周学习总结

    1. 本章学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 参考资料: 百度脑图 XMind 1.1 1.2 (1)用Arrays.sort ...

  9. 201521123057 《Java程序设计》第5周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过? ...

  10. 201521123064 《Java程序设计》第1周学习总结

    1. 本章学习总结 1.了解Java与C/C++的区别,Java语言所写程序较为繁琐,C/C++较为简洁. 2.学会使用cmd进行程序的编译及运行. 3.学会利用JDK辅助Java编程. 4.使用ec ...