poj-3744-Scout YYF I-矩阵乘法

本文介绍了一种利用矩阵快速幂的方法来加速动态规划问题的求解过程。具体实现包括定义矩阵结构、矩阵乘法、矩阵加法运算符,并通过递归方式实现了矩阵的快速幂算法。最终应用于特定动态规划问题的求解。

f[i]=f[i-1]*p+f[i-2]*(1-p);

正好能够用矩阵加速。

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<vector>
using namespace std;
struct matr
{
    double mat[3][3];
    friend matr operator *(const matr a,const matr b)
    {
        matr c;
        for(int i=1;i<=2;i++)
        {
            for(int j=1;j<=2;j++)
            {
                c.mat[i][j]=0;
                for(int k=1;k<=2;k++)
                {
                    c.mat[i][j]+=a.mat[i][k]*b.mat[k][j];
                }
            }
        }
        return c;
    }
    friend matr operator +(const matr a,const matr b)
    {
        matr c;
        for(int i=1;i<=2;i++)
        {
            for(int j=1;j<=2;j++)
            {
                c.mat[i][j]=a.mat[i][j]+b.mat[i][j];
            }
        }
        return a;
    }
}st,gg;
matr mul(matr a,int x)
{
    matr b;
    b.mat[1][1]=b.mat[2][2]=1;
    b.mat[1][2]=b.mat[2][1]=0;
    while(x)
    {
        if(x&1)b=b*a;
        x=x/2;
        a=a*a;
    }
    return b;
}
double get(int x)
{
    if(x<0)return 0;
    if(x==0)return 1;
    matr re;
    re=mul(gg,x);
    re=re*st;
    return re.mat[2][1];
}
int a[111];
int main()
{
    int n;
    double p;
    while(~scanf("%d%lf",&n,&p))
    {
        st.mat[1][1]=0;   st.mat[1][2]=0;
        st.mat[2][1]=1; st.mat[2][2]=0;
        gg.mat[1][1]=0;  gg.mat[1][2]=1;
        gg.mat[2][1]=1-p;gg.mat[2][2]=p;
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        sort(a+1,a+n+1);
        double ans=1.0;
        a[0]=0;
        for(int i=1;i<=n;i++)
        {
            int x=a[i]-a[i-1];
            ans=ans*get(x-2);
            ans=ans*(1-p);
           // cout<<ans<<endl;
        }
        printf("%.7f\n",ans);
    }
    return 0;
}


POJ 3213 题目是一个关于矩阵乘法的经典计算机科学问题。矩阵乘法通常是线性代数的基础操作,给定两个矩阵 A 和 B,你需要计算它们的乘积 C = A * B,其中每个元素 C[i][j] 是对应位置上 A 的行向量与 B 的列向量的点积。 以下是一个简单的 Java 代码示例,使用嵌套循环来实现矩阵乘法: ```java import java.util.Scanner; public class MatrixMultiplication { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); // 输入矩阵的维度 System.out.println("Enter the dimensions of matrix A (m x n):"); int m = scanner.nextInt(); int n = scanner.nextInt(); // 创建矩阵 A 和 B int[][] matrixA = new int[m][n]; int[][] matrixB = new int[n][n]; // 读取矩阵 A 的元素 System.out.println("Enter elements of matrix A:"); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { matrixA[i][j] = scanner.nextInt(); } } // 读取矩阵 B 的元素(假设输入的矩阵都是方阵,大小为 n x n) System.out.println("Enter elements of matrix B:"); for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { matrixB[i][j] = scanner.nextInt(); } } // 矩阵乘法 int[][] result = new int[m][n]; // 结果矩阵 for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { for (int k = 0; k < n; k++) { // 每次循环k用于遍历B的列 result[i][j] += matrixA[i][k] * matrixB[k][j]; } } } // 输出结果矩阵 System.out.println("Matrix multiplication result:"); for (int[] row : result) { for (int element : row) { System.out.print(element + " "); } System.out.println(); } scanner.close(); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值