古董键盘
时间:2022-07-25
本文章向大家介绍古董键盘,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
问题描述
小扣在秋日市集购买了一个古董键盘。由于古董键盘年久失修,键盘上只有 26 个字母 a~z 可以按下,且每个字母最多仅能被按 k 次。
小扣随机按了 n 次按键,请返回小扣总共有可能按出多少种内容。由于数字较大,最终答案需要对 1000000007 (1e9 + 7) 取模。
示例 1:
输入:k = 1, n = 1
输出:26
解释:由于只能按一次按键,所有可能的字符串为 "a", "b", ... "z"
示例 2:
输入:k = 1, n = 2
输出:650
解释:由于只能按两次按键,且每个键最多只能按一次,所有可能的字符串(按字典序排序)为 "ab", "ac", ... "zy"
提示:
1 <= k <= 5
1 <= n <= 26*k
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/Uh984O
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
大体思路
可以认为26个字母就是26种物品,其中每种物品的数量都为k。定义dp[i] [j] 为可选i种字母组成长度为j的字符串数目。
dp[26] [n]即为所求。
转移方程
x指的是当前选择x个i字母,C(j, x)表示从j个位置中选择x个位置用于存放字母i。因此只需要从0到k枚举x即可。
baseline:
第一个式子含义为使用i个字符构成长度为0的字符串数目只有一种;
第二个式子含义为当使用0个字符是不可能构成长度大于0的字符串,因此为0。
此外对于C(j, x)可以通过离线打表的方式获得,其递推式为C(n, m) = C(n - 1, m) + C(n-1,m-1)。
class Solution {
int mod = (int)1e9 + 7;
public int keyboard(int k, int n) {
int[][] C = new int[n + 1][n + 1];
init(C);
// dp[i][j] 表示使用 i 个单词,组成长度为j 的序列数目
long[][] dp = new long[27][n + 1];
for(int i = 0; i <= 26; i++){
dp[i][0] = 1;
}
// dp[0][j] = 0 j != 0
for(int i = 1; i <= 26; i++){
for(int j = 1; j <= n; j++){
for(int x = 0; x <= k; x++){
if(j - x < 0){
break;
}
dp[i][j] = dp[i][j] + dp[i - 1][j - x] * C[j][x];
}
dp[i][j] %= mod;
}
}
return (int)dp[26][n];
}
public void init(int[][] C){
for(int i = 1; i < C.length; i++){
C[i][0] = 1;
for(int j = 1; j < i; j++){
C[i][j] = (int)(((long)C[i - 1][j - 1] + C[i - 1][j]) % mod);
}
C[i][i] = 1;
}
}
}
- HUST 1541 Student’s question
- HDU 3785 寻找大富翁
- Hadoop数据分析平台实战——250JSSDK数据收集引擎编写离线数据分析平台实战——250JSSDK数据收集引擎编写
- HDU 2564 词组缩写
- 约瑟夫问题方法总结
- 欧里几德及扩展欧里几德算法
- Hadoop数据分析平台实战——260用户数据ETL离线数据分析平台实战——260用户数据ETL
- # Hadoop离线数据分析平台实战——230项目数据存储结构设计Hadoop离线数据分析平台实战——230项目数据存储结构设计
- ECJTUACM16 Winter vacation training #5 题解&源码
- Codeforces 716A Crazy Computer
- Hadoop数据分析平台实战——240JavaSDK数据收集引擎编写离线数据分析平台实战——240JavaSDK数据收集引擎编写
- Hadoop离线数据分析平台实战——290活跃用户分析Hadoop离线数据分析平台实战——290活跃用户分析
- Codeforces 719B Anatoly and Cockroaches
- 【一起学Python】爬取前程无忧招聘信息并写入Excel
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 小程序上传多张图片到springboot后台,返回可供访问的图片链接
- AndroidStudio Gradle基于友盟的多渠道打包方法
- Android开发之全屏与非全屏的切换设置方法小结
- Android使用GridView实现日历的方法
- Android控件AppWidgetProvider使用方法详解
- R语言使用链梯法Chain Ladder和泊松定律模拟和预测未来赔款数据
- Android ViewPager实现左右滑动的实例
- R语言通过伽玛与对数正态分布假设下的广义线性模型对大额索赔进行评估预测
- R语言中回归模型预测的不同类型置信区间应用比较分析
- 第06期:Prometheus 存储
- 新特性解读 | 数组范围遍历功能
- 技术分享 | MySQL 内存管理初探
- 新特性解读 | 窗口函数的适用场景
- Android自定义View 仿QQ侧滑菜单的实现代码
- Android view随触碰滑动效果