一、220周

题目链接

问题描述

键盘上有N个数字按键,每个按键只能按一次,每次可以按下多个键,请输出所有可能的按键情况。

输入一个整数N(N在1~8之间),输出全部的按键可能。例如:输入3,输出为

1-2-3
1-23
1-3-2
12-3
123
13-2
2-1-3
2-13
2-3-1
23-1
3-1-2
3-12
3-2-1

输出按照字符串大小从小到大输出。

思路

对于给定数组a,a中存放着备用数字,从a中分别取1,2,3,...len(a)个元素组成一组group。然后a-group=b,将b数组递归向后传递。

Java里面的迭代器比较难受,写出来的代码也拧巴,这点非常考验代码能力,是一道非常不错的面试题。

Python里面的生成器更简便。

代码

import sun.reflect.generics.tree.Tree;

import java.util.*;
import java.util.stream.Collectors; public class Main {
TreeSet<String> a = new TreeSet<>(); class SelectCount implements Iterator<String> {
int[] a;
int cnt;
int[] p;
boolean over = true; SelectCount(int[] a, int cnt) {
this.a = a;
this.cnt = cnt;
p = new int[cnt];
for (int i = 0; i < cnt; i++) {
p[i] = i;
}
} @Override
public boolean hasNext() {
return over;
} void move() {
for (int i = cnt - 1; i >= 0; i--) {
if (p[i] != a.length - cnt + i) {
p[i]++;
for (int j = i + 1; j < cnt; j++) {
p[j] = p[j - 1] + 1;
}
return;
}
}
over = false;
} @Override
public String next() {
String ans = Arrays.stream(p).map(x -> a[x]).mapToObj(x -> x + "").collect(Collectors.joining());
move();
return ans;
}
} void go(int[] a, LinkedList<String> l) {
// System.out.println(Arrays.stream(a).mapToObj(x -> x + "").collect(Collectors.joining()));
if (a.length == 0) {
this.a.add(l.stream().collect(Collectors.joining("-")));
return;
}
for (int i = 1; i <= a.length; i++) {
SelectCount sel = new SelectCount(a, i);
while (sel.hasNext()) {
String s = sel.next();
int[] b = new int[a.length - i];
int bi = 0;
//a数组减去b数组
for (int j = 0; j < a.length; j++) {
if (!s.contains(a[j] + "")) {
b[bi++] = a[j];
}
}
l.add(s);
go(b, l);
l.removeLast();
}
}
} Main() {
Scanner cin = new Scanner(System.in);
int N = cin.nextInt();
int[] a = new int[N];
for (int i = 1; i <= N; i++) {
a[i - 1] = i;
}
go(a, new LinkedList<>());
for (String i : this.a) {
System.out.println(i);
}
} public static void main(String[] args) {
new Main();
}
}

二、221周

题目链接

还是上面那样的题干,问题变成一道组合计数题,问一共有多少种按法。

枚举第一次按下的情况,剩下的情况递归解决,递归时可以利用DP加速,不加速肯定超时。计算组合数时,必须使用杨辉三角,否则太慢。使用编程语言时,必须用C/C++,连Java都会超时,这个超时当然是运行效率了。

#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
using namespace std;
int mod = 1000000007;
typedef long long ll;
ll c[1007][1007];
void init() {
memset(c, 0, sizeof(c));
for (int i = 0; i < 1007; i++)c[i][0] = 1;
c[0][0] = 1;
for (int i = 1; i < 1007; i++) {
for (int j = 1; j <= i; j++) {
c[i][j] = c[i - 1][j - 1] + c[i - 1][j];
c[i][j] %= mod;
}
}
}
ll dp[1007];
ll solve(int N) {
if (N == 1 || N == 0)return 1;
if (dp[N] != -1)return dp[N];
ll s = 0;
for (int i = 1; i <= N; i++) {
s += c[N][i]%mod * solve(N - i)%mod;
s %= mod;
}
dp[N] = s;
return s;
}
int main() {
int N;
cin >> N;
init();
memset(dp, -1, sizeof(dp));
cout << solve(N);
return 0;
}

hihocoder第220周-一道拧巴的题的更多相关文章

  1. hihoCoder 第136周 优化延迟(二分答案+手写堆)

    题目1 : 优化延迟 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Ho编写了一个处理数据包的程序.程序的输入是一个包含N个数据包的序列.每个数据包根据其重要程度不同 ...

  2. HihoCoder第三周与POJ2406:KMP算法总结

    HihoCoder第三周: 输入 第一行一个整数N,表示测试数据组数. 接下来的N*2行,每两行表示一个测试数据.在每一个测试数据中,第一行为模式串,由不超过10^4个大写字母组成,第二行为原串,由不 ...

  3. 洛谷P2918 [USACO08NOV]买干草(一道完全背包模板题)

    题目链接 很明显的一道完全背包板子题,做法也很简单,就是要注意 这里你可以买比所需多的干草,只要达到数量就行了 状态转移方程:dp[j]=min(dp[j],dp[j-m[i]]+c[i]) 代码如下 ...

  4. 又一道区间DP的题 -- P3146 [USACO16OPEN]248

    https://www.luogu.org/problemnew/show/P3146 一道区间dp的题,以区间长度为阶段; 但由于要处理相邻的问题,就变得有点麻烦; 最开始想了一个我知道有漏洞的方程 ...

  5. [真题] 一道 vsftp 运维题

    一道 vsftp 运维题 一.前言 在 V 站上凑巧看到了好友发的求助帖,五天时间一个理他的都没有.哈哈哈~ 废话不多说,我们来试试. 二.题目 这里我们假设存在这样的场景: 网络内有普通用户 ade ...

  6. QDUOJ 一道简单的数据结构题 栈的使用(括号配对)

    一道简单的数据结构题 发布时间: 2017年6月3日 18:46   最后更新: 2017年6月3日 18:51   时间限制: 1000ms   内存限制: 128M 描述 如果插入“+”和“1”到 ...

  7. hihocoder第42周 3*N骨牌覆盖(状态dp+矩阵快速幂)

    http://hihocoder.com/contest/hiho42/problem/1 给定一个n,问我们3*n的矩阵有多少种覆盖的方法 第41周做的骨牌覆盖是2*n的,状态转移方程是dp[i] ...

  8. hihocoder第42周 k*N骨牌覆盖(状态dp+矩阵快速幂)

    上周的3*N的骨牌,因为状态只有8中,所以我们可以手算出状态转移的矩阵 但是这周是k*N,状态矩阵不好手算,都是我们改成用程序自动生成一个状态转移的矩阵就行了,然后用这个矩阵进行快速幂即可 枚举枚举上 ...

  9. 【hihoCoder 第133周】2-SAT·hihoCoder音乐节

    http://hihocoder.com/contest/hiho133/problem/1 2-sat模板...详细的题解请看题目里的提示. tarjan模板打错again致命伤qwq #inclu ...

随机推荐

  1. python 听课笔记(一)

  2. 解决PHP使用CVS导出Excel乱码问题

    在使用PHP生成CVS文件后通过Excel打开发现中文全部变成了乱码,之前在我本地win08通过WPS正常的,但上传到服务器Linux在服务器上测试出现了乱码 一开始以后是Linux的问题但后来测试时 ...

  3. 在使用Vs2013打开Vs2008的解决方案时出现了以下错误:此版本的应用程序不支持其项目类型(.csproj)

    在使用Vs2013打开Vs2008的解决方案时出现了以下错误: 无法打开 因为此版本的应用程序不支持其项目类型(.csproj). 在网络上找到解决方案: 命令行或者Vs自带的命令提示符输入:deve ...

  4. Linux扩展文件分区

    **************操作之前请看章节6,看系统是否支持LVM分区管理方式*************** 1:新增磁盘 插入新的磁盘,比如物理机可以直接在卡槽插入,虚拟机可以在控制台添加磁盘或者 ...

  5. Windows server 2008 R2如何预览图片而不是显示图标?

      Previews of media files are disabled by default in Windows Server 2008. In this article we will en ...

  6. 【Python】将对象存成json文件及从json取出对象

    常用代码,单拎出来以备查. 对象存json文件: import json obj={'name':'张有财','age':39,'arr':[2,34,5,6,7,88,'李有钱']} with op ...

  7. Android 模仿微信启动动画

    本文内容 环境 项目结构 演示微信启动动画 本文演示微信启动动画.请点击此处下载,自行调试. 顺便抱怨一下,实践性(与研究性质的相对)技术博的"七宗罪": 第一宗罪,错字连篇,逻辑 ...

  8. NSobject 结构

    参考地址:  https://iosdevelopmenttutorials.wordpress.com/tag/uiscrollview/ Apple Documentation

  9. NSString json 车NSDictionary

    NSData *jsonContent = [[userInfo objectForKey:@"acme"] dataUsingEncoding:NSUTF8StringEncod ...

  10. LintCode: Restore IP Address

    C++ string::substr(start_pos, length) vector::push_back(element) class Solution { public: vector< ...