首页 > 其他 > 详细

hdu 2604 Queuing(动态规划—>矩阵快速幂,更通用的模版)

时间:2014-02-26 12:34:10      阅读:344      评论:0      收藏:0      [点我收藏+]

题目

 

 

最早不会写,看了网上的分析,然后终于想明白了矩阵是怎么出来的了,哈哈哈哈。

因为边上的项目排列顺序不一样,所以写出来的矩阵形式也可能不一样,但是都是可以的

 

bubuko.com,布布扣
//愚钝的我不会写这题,然后百度了,照着大神的题解,有了如下的东东:
//根据ff, mm, fm, mf ,先列出所有可能的组合方式(1表示连在一次,具体判断方式自己看看就知道了)
//  ff mm fm mf
//ff 1  0  1  0
//mm 0  1  0  1
//fm 0  1  0  1
//mf 1  0  1  0
//题目中说不能有fff和fmf,所以去掉他们,最终结果如下
//  ff mm fm mf
//ff 0  0  1  0
//mm 0  1  0  1
//fm 0  1  0  0
//mf 1  0  1  0
#include<stdio.h>
#include<string.h>
int num=4,mod;
struct matrix
{
    int a[4][4];
}answ;
matrix multiply(matrix x,matrix y)//矩阵乘法
{
    matrix temp;
    memset(temp.a,0,sizeof(temp.a));
    for(int i=0;i<num;i++)
    {
        for(int k=0;k<num;k++)
        {
            for(int j=0;j<num;j++)
            {
                temp.a[i][j]=(temp.a[i][j]+x.a[i][k]*y.a[k][j])%mod;
            }
        }
    }
    return temp;
}
matrix calc(matrix a,int n)//矩阵快速幂——a^n
{
    if(n==1)return a;
    matrix e;
    for(int i=0;i<num;i++)
        for(int j=0;j<num;j++)
            e.a[i][j]=(i==j);

    while(n)
    {
        if(n&1)
            e=multiply(e,a);
        n>>=1;
        a=multiply(a,a);
    }
    return e;
}
int main()
{
    int n,sum;
    while(scanf("%d%d",&n,&mod)!=EOF)
    {
        sum=0;
        matrix origin= {0,0,1,0,
                        0,1,0,1,
                        0,1,0,0,
                        1,0,1,0};
        answ=calc(origin,n-2);//因为给的项目是后两位
        for(int i=0;i<4;i++)
            for(int j=0;j<4;j++)
                sum=(sum+answ.a[i][j])%mod;
        printf("%d\n",sum);
    }
    return 0;
}
View Code

hdu 2604 Queuing(动态规划—>矩阵快速幂,更通用的模版)

原文:http://www.cnblogs.com/laiba2004/p/3567636.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!