HDU 4332 Constructing Chimney 矩阵快速幂

算法:

1.状态压缩

2.搜索

3.矩阵快速幂

View Code
#include<iostream>
using namespace std;

typedef long long LL;
const int mod = 1000000007;
const int mask = 255;

struct Matrix{
    LL mat[100][100];
    void unit(){
        memset(mat,0,sizeof(mat));
        for(int i = 0; i < 100; i++) mat[i][i]=1;    
    }    
    void zero(){
        memset(mat,0,sizeof(mat));    
    }
}T,A,U;
Matrix operator * (const Matrix &a,const Matrix &b){
    Matrix tmp; tmp.zero();
    for(int i = 0; i <= 70; i++){
        for(int k = 0; k <= 70; k++){
            if(!a.mat[i][k]) continue;
            for(int j = 0; j <= 70; j++){
                tmp.mat[i][j] += (a.mat[i][k]*b.mat[k][j])%mod;
                tmp.mat[i][j] %= mod;    
            }    
        }    
    }    
    return tmp;
}
Matrix operator ^(Matrix x,int k){
    Matrix tmp; tmp.unit();
    while(k){
        if(k&1) tmp = tmp*x;
        x = x*x; k = (k>>1);    
    }    
    return tmp;
}
Matrix Pow(Matrix x,int k){
    if(k == 0) return U;
    if(k&1) return (Pow(x,k/2)*Pow(x,k/2)*x);
    else    return (Pow(x,k/2)*(Pow(x,k/2)));
    
}
int vis[mask+10],id[mask+10],legal[mask+10],idx;
/*
判断横放是否合法
0 1 2
7   3
6 5 4
只要判断01234567,65432170是否有两个连续1
*/
    
bool check(int x){
    int y=0,t = x>>1;
    for(int i = 0; i < 7; i++){
        y = (y<<1) | (t&1);
        t >>= 1;    
    }    
    y = (y<<1) | (x&1);
    bool flag = true;
    for(int i = 0; i < 8; i++){
        if( !( x&(1<<i) ) ) continue;
        if( i == 7 || !( x&(1<<(i+1))) ){
            flag = false; break;    
        }
        i++;    
    }
    if(flag) return true;
    flag = true;
    for(int i = 0; i < 8; i++){
        if( !( y&(1<<i) ) ) continue;
        if( i == 7 || !( y&(1<<(i+1)) ) ){
            flag = false; break;    
        }    
        i++;
    }
    return flag;
}
/*
搜索出合法状态,并且再把状态压缩。。
*/ 
void DFS(int x){
    if( vis[x] ) return;  vis[x] = 1;
    
    int c = ~x & mask;
    if( id[x] == -1 ) id[x] = idx++;
    for(int i = 0; i <= mask; i++){
        if( (i&c)==c && check( i&x ) ){    
            if( id[i] == -1 ) id[i] = idx++;    
            T.mat[ id[i] ][ id[x] ] = 1;
            if( !vis[i] ) DFS(i);
        }    
    }    
}

void init(){
    T.zero(); U.unit();
    memset(vis,0,sizeof(vis));
    memset(id,0xff,sizeof(id));
    idx = 0; 
    DFS(mask); T.mat[0][0]+=1; 
    memset(legal,0,sizeof(legal));
    for(int i = 0; i <= mask; i++){
        if( ~id[i] && T.mat[id[i]][0] ) 
            legal[ id[i] ] = 1;    
    } 
    legal[0] += 1;
}
void solve(int k){
    A = T^(k-1);
    LL res = 0;
    for(int i = 0; i < idx; i++){
        res = (res+legal[i]*A.mat[i][0]%mod)%mod;
    }    
    printf("%I64d\n", res);
}
int main(){
    //freopen("1002.in","r",stdin);
    //freopen("1.out","w",stdout);
    init();    
    int t, k;
    scanf("%d", &t);
    for(int ncase = 1; ncase <= t; ncase++){
        scanf("%d",&k);
        printf("Case %d: ", ncase);
        solve(k);    
    }
}

转载于:https://www.cnblogs.com/tangcong/archive/2012/08/18/2645583.html

深度学习是机器学习的一个子领域,它基于人工神经网络的研究,特别是利用多层次的神经网络来进行学习和模式识别。深度学习模型能够学习数据的高层次特征,这些特征对于图像和语音识别、自然语言处理、医学图像分析等应用至关重要。以下是深度学习的一些关键概念和组成部分: 1. **神经网络(Neural Networks)**:深度学习的基础是人工神经网络,它是由多个层组成的网络结构,包括输入层、隐藏层和输出层。每个层由多个神经元组成,神经元之间通过权重连接。 2. **前馈神经网络(Feedforward Neural Networks)**:这是最常见的神经网络类型,信息从输入层流向隐藏层,最终到达输出层。 3. **卷积神经网络(Convolutional Neural Networks, CNNs)**:这种网络特别适合处理具有网格结构的数据,如图像。它们使用卷积层来提取图像的特征。 4. **循环神经网络(Recurrent Neural Networks, RNNs)**:这种网络能够处理序列数据,如时间序列或自然语言,因为它们具有记忆功能,能够捕捉数据中的时间依赖性。 5. **长短期记忆网络(Long Short-Term Memory, LSTM)**:LSTM 是一种特殊的 RNN,它能够学习长期依赖关系,非常适合复杂的序列预测任务。 6. **生成对抗网络(Generative Adversarial Networks, GANs)**:由两个网络组成,一个生成器和一个判别器,它们相互竞争,生成器生成数据,判别器评估数据的真实性。 7. **深度学习框架**:如 TensorFlow、Keras、PyTorch 等,这些框架提供了构建、训练和部署深度学习模型的工具和库。 8. **激活函数(Activation Functions)**:如 ReLU、Sigmoid、Tanh 等,它们在神经网络中用于添加非线性,使得网络能够学习复杂的函数。 9. **损失函数(Loss Functions)**:用于评估模型的预测与真实值之间的差异,常见的损失函数包括均方误差(MSE)、交叉熵(Cross-Entropy)等。 10. **优化算法(Optimization Algorithms)**:如梯度下降(Gradient Descent)、随机梯度下降(SGD)、Adam 等,用于更新网络权重,以最小化损失函数。 11. **正则化(Regularization)**:技术如 Dropout、L1/L2 正则化等,用于防止模型过拟合。 12. **迁移学习(Transfer Learning)**:利用在一个任务上训练好的模型来提高另一个相关任务的性能。 深度学习在许多领域都取得了显著的成就,但它也面临着一些挑战,如对大量数据的依赖、模型的解释性差、计算资源消耗大等。研究人员正在不断探索新的方法来解决这些问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值