Problem Description
这是一个简单的生存游戏,你控制一个机器人从一个棋盘的起始点(1,1)走到棋盘的终点(n,m)。游戏的规则描述如下: 1.机器人一开始在棋盘的起始点并有起始点所标有的能量。 2.机器人只能向右或者向下走,并且每走一步消耗一单位能量。 3.机器人不能在原地停留。 4.当机器人选择了一条可行路径后,当他走到这条路径的终点时,他将只有终点所标记的能量。如上图,机器人一开始在(1,1)点,并拥有4单位能量,蓝色方块表示他所能到达的点,如果他在这次路径选择中选择的终点是(2,4)
点,当他到达(2,4)点时将拥有1单位的能量,并开始下一次路径选择,直到到达(6,6)点。 我们的问题是机器人有多少种方式从起点走到终点。这可能是一个很大的数,输出的结果对10000取模。
 
Input
第一行输入一个整数T,表示数据的组数。 对于每一组数据第一行输入两个整数n,m(1 <= n,m <= 100)。表示棋盘的大小。接下来输入n行,每行m个整数e(0 <= e < 20)。
 
Output
对于每一组数据输出方式总数对10000取模的结果.
 
Sample Input
1
6 6
4 5 6 6 4 3
2 2 3 1 7 2
1 1 4 6 2 7
5 8 4 3 9 5
7 6 6 2 1 5
3 1 1 3 7 2
 
Sample Output
3948
 

方法一:当前的这个点可以到达其他点的方法数(直接4重循环)

  1. #pragma comment(linker, "/STACK:1024000000,1024000000")
  2. #include<iostream>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<math.h>
  7. #include<algorithm>
  8. #include<queue>
  9. #include<set>
  10. #include<bitset>
  11. #include<map>
  12. #include<vector>
  13. #include<stdlib.h>
  14. using namespace std;
  15. #define ll long long
  16. #define eps 1e-10
  17. #define MOD 10000
  18. #define inf 1e12
  19. #define N 106
  20. int n,m;
  21. int mp[N][N];
  22. int dp[N][N];
  23. int main()
  24. {
  25. int t;
  26. scanf("%d",&t);
  27. while(t--){
  28. scanf("%d%d",&n,&m);
  29. for(int i=;i<=n;i++){
  30. for(int j=;j<=m;j++){
  31. scanf("%d",&mp[i][j]);
  32. }
  33. }
  34. memset(dp,,sizeof(dp));
  35. dp[][]=;
  36. for(int i=;i<=n;i++){
  37. for(int j=;j<=m;j++){
  38. for(int k=i;(k<=n) && (k<=mp[i][j]+i);k++){
  39. for(int w=j;(w<=m) && (w<=mp[i][j]+i+j-k);w++){
  40. if((k==i) && (w==j))continue;
  41. dp[k][w]+=dp[i][j];
  42. dp[k][w]%=MOD;
  43. }
  44. }
  45. }
  46. }
  47. printf("%d\n",dp[n][m]%MOD);
  48. }
  49. return ;
  50. }

方法二:记忆化dp,标记dp[n][m]=1,然后从前往后记忆化dp,dfs

  1. #pragma comment(linker, "/STACK:1024000000,1024000000")
  2. #include<iostream>
  3. #include<cstdio>
  4. #include<cstring>
  5. #include<cmath>
  6. #include<math.h>
  7. #include<algorithm>
  8. #include<queue>
  9. #include<set>
  10. #include<bitset>
  11. #include<map>
  12. #include<vector>
  13. #include<stdlib.h>
  14. using namespace std;
  15. #define ll long long
  16. #define eps 1e-10
  17. #define MOD 10000
  18. #define N 106
  19. #define inf 1e12
  20. int n,m;
  21. int mp[N][N];
  22. int dp[N][N];
  23. bool judge(int x,int y){
  24. if(x< || x>n || y< || y>m) return false;
  25. return true;
  26. }
  27. int dfs(int x,int y){
  28. if(dp[x][y]>=) return dp[x][y];
  29. dp[x][y]=;
  30. for(int i=;i<=mp[x][y];i++){
  31. for(int j=;j<=mp[x][y]-i;j++){
  32. if(judge(x+i,y+j)){
  33. dp[x][y]=(dp[x][y]+dfs(x+i,y+j))%MOD;
  34. }
  35. }
  36. }
  37. return dp[x][y];
  38. }
  39. int main()
  40. {
  41. int t;
  42. scanf("%d",&t);
  43. while(t--){
  44. scanf("%d%d",&n,&m);
  45. for(int i=;i<=n;i++){
  46. for(int j=;j<=m;j++){
  47. scanf("%d",&mp[i][j]);
  48. }
  49. }
  50. memset(dp,-,sizeof(dp));
  51. dp[n][m]=;
  52. printf("%d\n",dfs(,));
  53. }
  54. return ;
  55. }

hdu 1978 How many ways(dp)的更多相关文章

  1. HDU 1978 How many ways(动态规划)

    How many ways http://acm.hdu.edu.cn/showproblem.php?pid=1978 Problem Description 这是一个简单的生存游戏,你控制一个机器 ...

  2. HDU 2639 Bone Collector II (dp)

    题目链接 Problem Description The title of this problem is familiar,isn't it?yeah,if you had took part in ...

  3. HDU 1864 最大报销额(DP)

    题目网址:http://acm.hdu.edu.cn/showproblem.php?pid=1864 题目: 最大报销额 Time Limit: 1000/1000 MS (Java/Others) ...

  4. HDU 4562 守护雅典娜(dp)

    守护雅典娜 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submi ...

  5. HDU - 6199 gems gems gems (DP)

    有n(2e4)个宝石两个人轮流从左侧取宝石,Alice先手,首轮取1个或2个宝石,如果上一轮取了k个宝石,则这一轮只能取k或k+1个宝石.一旦不能再取宝石就结束.双方都希望自己拿到的宝石数比对方尽可能 ...

  6. HDU 1978 How many ways(经典记忆化搜索)

    S - How many ways Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u S ...

  7. HDU - 6357 Hills And Valleys(DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=6357 题意 给一个数值范围为0-9的a数组,可以选择翻转一个区间,问非严格最长上升子序列,以及翻转的区间. 分析 ...

  8. 2014多校第四场1005 || HDU 4901 The Romantic Hero (DP)

    题目链接 题意 :给你一个数列,让你从中挑选一些数组成集合S,挑另外一些数组成集合T,要求是S中的每一个数在原序列中的下标要小于T中每一个数在原序列中下标.S中所有数按位异或后的值要与T中所有的数按位 ...

  9. hdu 5623 KK's Number(dp)

    问题描述 我们可爱的KK有一个有趣的数学游戏:这个游戏需要两个人,有N\left(1\leq N\leq 5*{10}^{4} \right)N(1≤N≤5∗10​4​​)个数,每次KK都会先拿数.每 ...

随机推荐

  1. codecomb 2090【最小乘积路】

    题目描述 给定n个点的带权有向图,求从1到n的路径中边权之积最小的简单路径. 输入格式 第一行读入两个整数n,m,表示共n个点m条边. 接下来m行,每行三个正整数x,y,z,表示点x到点y有一条边权为 ...

  2. House Robber 解答

    Question You are a professional robber planning to rob houses along a street. Each house has a certa ...

  3. [置顶] ID3算法的python实现

    这篇文章的内容接着http://blog.csdn.net/xueyunf/article/details/9214727的内容,所有还有部分函数在http://blog.csdn.net/xueyu ...

  4. Echarts动态数据显示

    自己慢慢摸索出来的,留着以后可能会用到 一.先引入jquery,再引入echarts.js 二.配置容器 三.配置路径和数据选项等 <script type="text/javascr ...

  5. Test 2.14

    i am back 写博客是个好习惯啊,要坚持下去才行 这些天的日子实在堕落

  6. flex与js相互调用

    1.flex调用js方法 调用方法例如:ExternalInterface.call("UploadComplete",oldName,uidName,_dir+"/&q ...

  7. <转>maven发布第三方jar的一些问题

    在创建maven中私有仓库过程中,需要发布一些第三方jar到nexus仓库,使用命令的是 deploy:deploy-file 有许多参数,具体可查看 http://maven.apache.org/ ...

  8. iOS中通知的添加和移除

    我们都知道viewWillAppear:方法是在控制器的view将要显示的时候调用的,而viewWillDisappear:方法是在控制器的view将要隐藏的时候调用.很多时候我们根据自身需要将相关代 ...

  9. operator 类型转换符

    参考脚本之家的这篇博客   http://www.jb51.net/article/41333.htm 类型转换操作符(type conversion operator)是一种特殊的类成员函数,它定义 ...

  10. IE的documentMode属性

    参看下面链接:<IE的documentModeshuxing>