我是靠谱客的博主 粗犷小海豚,最近开发中收集的这篇文章主要介绍SCU2016-06 R题矩阵快速幂优化的dp,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

分析
定义 dp[k][i][j] 为以 ai 开头, aj 结尾长度为 k 的序列的个数,容易有一个递推,然后写成矩阵开始幂来优化掉k就可以了。
这种矩阵快速幂主要是在后面加一个就是合法。

/*

*/

#include <iostream>
#include <algorithm>
using namespace std;
class matrix
{
public:
    long long m[109][109];
    int n, mod = int(1e9) + 7;
    matrix(int x, int pos = 0) {
        n = x;
        for (int i = 0; i < x; i++) 
            for (int j = 0; j < x; j++) m[i][j] = (i == j) * pos;
    }

    matrix operator*(matrix &A) {
        matrix ret(n);
        for (int i = 0; i < n; i++) 
            for (int j = 0; j < n; j++) 
                for (int k = 0; k < n; k++)
                    ret.m[i][j] = (ret.m[i][j] + m[i][k] * A.m[k][j]) % mod;
        return ret;
    }
};

long long A[109];

int main()
{
    //freopen("in.txt", "r", stdin);
    long long  n, k;
    cin >> n >> k;
    for (int i = 0; i < n; i++) cin >> A[i];
    k--;
    matrix E(n, 1), move(n);
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            move.m[i][j] = (int(__builtin_popcountll(A[i] ^ A[j])) % 3 == 0);
    while (k) {
        if (k & 1) E = E * move;
        k >>= 1;
        move = move * move;
    }
    long long  ans = 0;
    for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++)
            ans = (ans + E.m[i][j]) % E.mod;
    cout << ans << endl;

}

最后

以上就是粗犷小海豚为你收集整理的SCU2016-06 R题矩阵快速幂优化的dp的全部内容,希望文章能够帮你解决SCU2016-06 R题矩阵快速幂优化的dp所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部