题目链接

http://acm.hdu.edu.cn/showproblem.php?pid=2157

这道题目很多人的题解都是矩阵快速幂写的,矩阵快速幂倒是麻烦了许多了。先给DP的方法

dp[i][j] 表示走过了i个点到了j点的步数

  1. #include <iostream>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <algorithm>
  6. #include <math.h>
  7. using namespace std;
  8. const int mod=1000;
  9. int n,m;
  10. int a[25][25];
  11. int dp[25][25];
  12. int t;
  13. int main()
  14. {
  15. int x,y,k;
  16. while(scanf("%d%d",&n,&m)!=EOF)
  17. {
  18. if(n==0&&m==0)
  19. break;
  20. memset(a,0,sizeof(a));
  21. for(int i=1;i<=m;i++)
  22. {
  23. scanf("%d%d",&x,&y);
  24. a[x][y]=1;
  25. }
  26. scanf("%d",&t);
  27. while(t--)
  28. {
  29. scanf("%d%d%d",&x,&y,&k);
  30. memset(dp,0,sizeof(dp));
  31. dp[1][x]=1;
  32. for(int i=2;i<=k+1;i++)
  33. {
  34. for(int j=0;j<n;j++)
  35. {
  36. for(int p=0;p<n;p++)
  37. {
  38. if(p==j) continue;
  39. if(dp[i-1][p]!=0&&a[p][j]==1)
  40. (dp[i][j]+=(dp[i-1][p])%mod)%=mod;
  41. }
  42. }
  43. }
  44. printf("%d\n",dp[k+1][y]);
  45. }
  46. }
  47. return 0;
  48. }

矩阵快速幂的方法也很好理解。把这个图用邻接矩阵A表示,A(i,j)=1表示从i到j有一条路,让C=A*A C(i,j)=sum{A(i,k)*A(k,j)} 表示从i到j经过2个点的路径数,所以经过几个点,就是求矩阵A的几次方。

效率比DP要低

  1. #include <iostream>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <stdio.h>
  5. #include <algorithm>
  6. #include <math.h>
  7. using namespace std;
  8. const int mod=1000;
  9. struct Node
  10. {
  11. int a[25][25];
  12. };
  13. int n,m,x,y,k,t;
  14. Node multiply(Node a,Node b)
  15. {
  16. Node c;
  17. memset(c.a,0,sizeof(c.a));
  18. for(int i=0;i<n;i++)
  19. {
  20. for(int j=0;j<n;j++)
  21. {
  22. if(!a.a[i][j]) continue;
  23. for(int k=0;k<n;k++)
  24. {
  25. (c.a[i][k]+=(a.a[i][j]*b.a[j][k])%mod)%=mod;
  26. }
  27. }
  28. }
  29. return c;
  30. }
  31. Node get(Node a,int x)
  32. {
  33. Node c;
  34. memset(c.a,0,sizeof(c.a));
  35. for(int i=0;i<n;i++)
  36. c.a[i][i]=1;
  37. for(x;x;x>>=1)
  38. {
  39. if(x&1)
  40. c=multiply(c,a);
  41. a=multiply(a,a);
  42. }
  43. return c;
  44. }
  45. int main()
  46. {
  47. while(scanf("%d%d",&n,&m)!=EOF)
  48. {
  49. if(n==0&&m==0)
  50. break;
  51. Node a;
  52. memset(a.a,0,sizeof(a.a));
  53. for(int i=1;i<=m;i++)
  54. {
  55. scanf("%d%d",&x,&y);
  56. a.a[x][y]=1;
  57. }
  58. scanf("%d",&t);
  59. Node c;
  60. while(t--)
  61. {
  62. c=a;
  63. scanf("%d%d%d",&x,&y,&k);
  64. c=get(c,k);
  65. printf("%d\n",c.a[x][y]);
  66. }
  67. }
  68. }

HDU 2157 How many ways??(简单线性DP | | 矩阵快速幂)的更多相关文章

  1. HDU 5434 Peace small elephant 状压dp+矩阵快速幂

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5434 Peace small elephant  Accepts: 38  Submissions: ...

  2. codeforces E. Okabe and El Psy Kongroo(dp+矩阵快速幂)

    题目链接:http://codeforces.com/contest/821/problem/E 题意:我们现在位于(0,0)处,目标是走到(K,0)处.每一次我们都可以从(x,y)走到(x+1,y- ...

  3. bnuoj 34985 Elegant String DP+矩阵快速幂

    题目链接:http://acm.bnu.edu.cn/bnuoj/problem_show.php?pid=34985 We define a kind of strings as elegant s ...

  4. 【BZOJ】2004: [Hnoi2010]Bus 公交线路 状压DP+矩阵快速幂

    [题意]n个点等距排列在长度为n-1的直线上,初始点1~k都有一辆公车,每辆公车都需要一些停靠点,每个点至多只能被一辆公车停靠,且每辆公车相邻两个停靠点的距离至多为p,所有公车最后会停在n-k+1~n ...

  5. 【BZOJ】4861: [Beijing2017]魔法咒语 AC自动机+DP+矩阵快速幂

    [题意]给定n个原串和m个禁忌串,要求用原串集合能拼出的不含禁忌串且长度为L的串的数量.(60%)n,m<=50,L<=100.(40%)原串长度为1或2,L<=10^18. [算法 ...

  6. BZOJ5298 CQOI2018 交错序列 【DP+矩阵快速幂优化】*

    BZOJ5298 CQOI2018 交错序列 [DP+矩阵快速幂优化] Description 我们称一个仅由0.1构成的序列为"交错序列",当且仅当序列中没有相邻的1(可以有相邻 ...

  7. Codeforces 621E Wet Shark and Block【dp + 矩阵快速幂】

    题意: 有b个blocks,每个blocks都有n个相同的0~9的数字,如果从第一个block选1,从第二个block选2,那么就构成12,问对于给定的n,b有多少种构成方案使最后模x的余数为k. 分 ...

  8. [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂)

    [BZOJ1009] [HNOI2008] GT考试(KMP+dp+矩阵快速幂) 题面 阿申准备报名参加GT考试,准考证号为N位数X1X2-.Xn,他不希望准考证号上出现不吉利的数字.他的不吉利数学A ...

  9. [bzoj1875][SDOI2009] HH去散步 [dp+矩阵快速幂]

    题面 传送门 正文 其实就是让你求有多少条长度为t的路径,但是有一个特殊条件:不能走过一条边以后又立刻反着走一次(如果两次经过同意条边中间隔了别的边是可以的) 如果没有这个特殊条件,我们很容易想到dp ...

随机推荐

  1. 在ajax请求体外得到请求 数据

    function sendAjax() { $.ajax({ type: "post", url: "/flow/process/trace.afca?pid=" ...

  2. LoadRunner “add measurements”(添加度量)菜单问题

    HP LoadRunner 11版本  配置

  3. Windows BAT

    一个BAT拷贝程序: :: For example: SRC_PATH = C:\hello\world :: and DEST_PATH = E:\another :: this program w ...

  4. 单调栈poj2796

    题意:给你一段区间,需要你求出(在这段区间之类的最小值*这段区间所有元素之和)的最大值...... 例如: 6 3 1 6 4 5 2 以4为最小值,向左右延伸,6 4 5  值为60....... ...

  5. 在sql中根据成绩显示学生排名

    1.准备 create table newtable ( name ), yuwen ), shuxue ) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; , ); , ...

  6. PHP之文件大小的转换函数

    直接看代码: <?php function tosize($size){ $s = $size; $dw = "";#pow(2,40)是2的40次方. if($s > ...

  7. 算法 quick sort

    // ------------------------------------------------------------------------------------------------- ...

  8. [基础]关于extern指针和数组的用法

    之前有在外面面试,遇到一题如下: filea.c char *p = "abcdefg"; fileb.c extern char p[]; printf(]); result=? ...

  9. Nginx配置proxy_pass转发的/路径

    请求原地址 :http://servername/static_js/test.html location ^~ /static_js/ { proxy_cache js_cache; proxy_s ...

  10. 打印-print.js

    //打印开始// strPrintName 打印任务名// printDatagrid 要打印的datagridfunction CreateFormPage(ctx,strPrintName, pr ...