Em đang chuyển ngôn ngữ từ Free Pascal sang C++
Và phần áp dụng nhân ma trận để quy hoạch động thì em không biết code như thế nào cả.
Các anh có thể hướng dẫn em cách nhân ma trận trong C++, nếu có thể cho em xin 1 code mẫu được không ạ?
Em xin cảm ơn

bạn biết cách gõ vòng for trong C++ chưa?

Trả lời quochuu_96
  Hiện bài gốc

Ý em là phần dùng nhân ma trận để quy hoạch động ấy
Em không biết lũy thừa ma trận kiểu gì cả @@

Trả lời tapcode
  Hiện bài gốc

Tại bạn nói là chuyển từ free pascal sang C++. Câu này không liên quan khiến mình hiểu nhầm.

Ma trận có tính chất a*b*c = a*(b*c) => a*b*b*...*b*b = a*b^n.

Muốn tính lũy thừa ma trận nhanh thì dùng chia để trị giống tính a^b với a và b là 2 số nguyên nhanh vậy.

Nếu b lẻ  a^b = a^(b/c)*a^(b/c)*a

Nếu b chẵn a^b  = a^(b/2)*a^(b/2)

Trả lời quochuu_96
  Hiện bài gốc

Pascal em code cái này ngon ơ, nhưng sang c++ không làm được, vì hình như không để 1 ma trận làm mục tiêu của hàm được

Trả lời tapcode
  Hiện bài gốc

dùng struct đi bạn, truyền struct vào

Trả lời tapcode
  Hiện bài gốc

Bạn có thể post đoạn chương trình bạn đang mắc cần chuyển từ pascal sang, mình sẽ chuyển hộ.

Trả lời Nezx
  Hiện bài gốc

Vâng, ví dụ đơn giản như bài LATGACH4, anh giúp em với

Trả lời tapcode
  Hiện bài gốc

Code mình vừa submit và AC. (Lưu ý là chọn C++14 để nộp)

#include <cstdio>
#include <vector>
using namespace std;

#define ll long long
#define matrix vector<vector<ll>>

const ll BASE = 111539786;

matrix a = {{0, 1}, {1, 1}};
matrix r = {{0, 0}, {0, 0}};
ll t, n;

matrix operator * (const matrix &a, const matrix &b) {
    matrix c = {{0, 0}, {0, 0}};
    for (int i = 0; i < 2; i++) {
        for (int j = 0; j < 2; j++) {
            for (int k = 0; k < 2; k++) {
                c[i][j] = (c[i][j] + (a[i][k] * b[k][j]) % BASE) % BASE;
            }
        }
    }
    return c;
}

matrix power(ll n) {
    if (n == 1) return a;
    matrix t = power(n / 2);
    t = t * t;
    if (n % 2 == 1) t = t * a;
    return t;
}

int main() {
    scanf("%lld", &t);
    for (int i = 1; i <= t; i++) {
        scanf("%lld", &n);
        if (n == 1) printf("1\n");
        else {
            r = power(n - 1);
            printf("%lld\n", (r[0][1] + r[1][1]) % BASE);
        }
    }
}

 

Trả lời Nezx
  Hiện bài gốc

cảm ơn anh nhiều nhé

Trả lời tapcode
  Hiện bài gốc

Bạn có thể tham khảo bài http://vn.spoj.com/problems/DHLOCO/

Đây là bài nhân ma trận rất rất cơ bản cho công thức fibonaxi f[i] = f[i-1] + f[i-2] + f[i-3]

Bạn có thể tham khảo thuật toán và code tại: http://yeulaptrinh.pw/86/spoj-dhlock/