抽屉上锁(计数dp+高精度)

3 篇文章 0 订阅

题目描述
现在我们来考虑对一个有N层抽屉的柜子上锁。该柜子中的所有抽屉都整齐地排布在一列上,并且相邻上下两个抽屉之间没有木板分隔。也就是说,如果第一层的抽屉没有锁上,即使第二层的抽屉锁上了,我们也能够拿到第二层抽屉里面的东西(将第一层的抽屉抽出来)。我们的问题是,如果要求恰好只有M层抽屉里面的东西拿不到,总共有多少种不同的锁抽屉方式呢?
输入
输入包括两个数N和M,意义如题目中所描述。
输出
输出仅包含一个整数,即答案。
样例输入
6 4
样例输出
6
提示
对于20%的数据,有1≤N, M≤10;
对于50%的数据,有1≤N, M≤65;
对于100%的数据,有1≤N, M≤300。
解题思路:每个抽屉有锁和不锁两种状态,而且这层抽屉能否拿出只与自己和上一层抽屉的状态有关,所以想到dp。
dp[i][j][0]表示i层抽屉有j个拿不到并且这层抽屉是没锁的,dp[i][j][1]表示表示i层抽屉有j个拿不到并且这层抽屉是上锁的。
状态转移方程位(根据方程自己看一下很容易就理解了):
dp[i][j][1]=dp[i-1][j-1][1],dp[i-1][j][0];
dp[i][j][0]=dp[i-1][j][0],dp[i-1][j][1];
注意:在计数过程中,因数太大会导致爆炸,所以采用高精度

#include<bits/stdc++.h>
//#pragma GCC optimize(2)
#define N 100005
using namespace std;
typedef long long int ll;
typedef unsigned long long int ull;
const int mod=1e9+7;
const int INF=0x7fffffff;
const int inf=0x3f3f3f3f;
const ull base=131;
//高精加
string jia(string a,string b){
    string s="";
    int aa[1100],bb[1100],cc[1100];
    memset(aa,0,sizeof(aa));
    memset(bb,0,sizeof(bb));
    memset(cc,0,sizeof(cc));
    int lena=a.size(),lenb=b.size();
    for(int i=1;i<=lena;i++) aa[i]=a[lena-i]-'0';
    for(int i=1;i<=lenb;i++) bb[i]=b[lenb-i]-'0';
    int len=1;
    while(len<=lena||len<=lenb){
        cc[len]+=aa[len]+bb[len];
        if(cc[len]>=10){
            cc[len+1]=cc[len]/10;
            cc[len]%=10;
        }
        len++;
    }
    while(!cc[len]&&len>1) len--;
    for(int i=len;i>=1;i--) s+=cc[i]+'0';
    return s;
}

string dp[310][310][2];
int n,m;
int main(){
    cin>>n>>m;
    dp[0][0][1]=dp[1][0][0]=dp[1][1][1]="1";
    for(int i=2;i<=n;i++) dp[i][0][0]=jia(dp[i-1][0][0],dp[i-1][0][1]),dp[i][0][1]=dp[i-1][0][0];//初始化边界
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m&&i>=j;j++){
            dp[i][j][1]=jia(dp[i-1][j-1][1],dp[i-1][j][0]);
            dp[i][j][0]=jia(dp[i-1][j][0],dp[i-1][j][1]);
        }
    }
    cout<<jia(dp[n][m][0],dp[n][m][1]);
    return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
Go语言(也称为Golang)是由Google开发的一种静态强类型、编译型的编程语言。它旨在成为一门简单、高效、安全和并发的编程语言,特别适用于构建高性能的服务器和分布式系统。以下是Go语言的一些主要特点和优势: 简洁性:Go语言的语法简单直观,易于学习和使用。它避免了复杂的语法特性,如继承、重载等,转而采用组合和接口来实现代码的复用和扩展。 高性能:Go语言具有出色的性能,可以媲美C和C++。它使用静态类型系统和编译型语言的优势,能够生成高效的机器码。 并发性:Go语言内置了对并发的支持,通过轻量级的goroutine和channel机制,可以轻松实现并发编程。这使得Go语言在构建高性能的服务器和分布式系统时具有天然的优势。 安全性:Go语言具有强大的类型系统和内存管理机制,能够减少运行时错误和内存泄漏等问题。它还支持编译时检查,可以在编译阶段就发现潜在的问题。 标准库:Go语言的标准库非常丰富,包含了大量的实用功能和工具,如网络编程、文件操作、加密解密等。这使得开发者可以更加专注于业务逻辑的实现,而无需花费太多时间在底功能的实现上。 跨平台:Go语言支持多种操作系统和平台,包括Windows、Linux、macOS等。它使用统一的构建系统(如Go Modules),可以轻松地跨平台编译和运行代码。 开源和社区支持:Go语言是开源的,具有庞大的社区支持和丰富的资源。开发者可以通过社区获取帮助、分享经验和学习资料。 总之,Go语言是一种简单、高效、安全、并发的编程语言,特别适用于构建高性能的服务器和分布式系统。如果你正在寻找一种易于学习和使用的编程语言,并且需要处理大量的并发请求和数据,那么Go语言可能是一个不错的选择。
抽屉式效果页面是指在网页实现类似抽屉的效果,即点击或拖拽某个元素,可以展开或收起另一个元素。要实现这一效果,需要使用CSS和JavaScript的技术。 首先,在CSS,可以使用`display`属性来控制元素的显示与隐藏。比如,设置一个元素的`display`为`none`,就可以将其隐藏起来;设置为`block`或`inline-block`,则可以将其显示出来。 其次,使用JavaScript来操作元素的显示与隐藏。可以通过事件来监听用户的操作,比如点击或拖拽。当用户点击或拖拽特定元素时,可以通过JavaScript来更改被抽屉效果影响的元素的`display`属性,从而实现展开或收起的效果。 具体实现抽屉式效果页面的步骤如下: 1. 创建一个HTML文件,并引入所需的CSS和JavaScript文件。 2. 在HTML文件,添加需要进行抽屉效果的元素。比如,可以使用`div`来创建一个抽屉效果的容器,并在其嵌套需要展开或收起的内容。 3. 使用CSS样式来初始化抽屉效果容器和内容的样式,比如设置宽度、高度、颜色等。 4. 在JavaScript,监听用户的操作事件,比如点击或拖拽事件。 5. 当用户触发操作事件时,通过JavaScript来更改抽屉效果容器或内容的`display`属性,将其展开或收起。 6. 可以添加一些动画效果,使抽屉的展开和收起更加平滑和流畅。 7. 最后,可以根据需求添加其他样式和功能,来进一步优化抽屉效果页面的用户体验。 通过CSS和JavaScript的配合,可以实现各种不同样式的抽屉式效果页面,让网页更加丰富有趣。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值