一、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. Spiral Matrix leetcode java

    题目: Given a matrix of m x n elements (m rows, n columns), return all elements of the matrix in spira ...

  2. Maven镜像更换为阿里云中央仓库

    前言 maven仓库默认在国外,使用难免很慢,尤其是下载依赖的时候,换为国内镜像,让你感受飞一般的感觉.国内支持maven镜像的有阿里云,开源中国等,这里换为阿里云的. 更换 修改maven配置文件s ...

  3. windows下mysql忘记root密码的解决办法

    今天早上 一朋友说自己的mysql 忘记root密码了 让我帮忙给看看,因为没有接触过mysql 所以从网上找了一下信息经我亲身实践  已经成功!mysql版本是5.1以下是从网上找的信息: 1. 首 ...

  4. tf.contrib.rnn.static_rnn与tf.nn.dynamic_rnn区别

    tf.contrib.rnn.static_rnn与tf.nn.dynamic_rnn区别 https://blog.csdn.net/u014365862/article/details/78238 ...

  5. 利用shell脚本批量提交网站404死链给百度

    网站运营人员对于死链这个概念一定不陌生,网站的一些数据删除或页面改版等都容易制造死链,影响用户体验不说,过多的死链还会影响到网站的整体权重或排名. 百度站长平台提供的死链提交工具,可将网站存在的死链( ...

  6. C# winForm webBrowser页面中js调用winForm类方法(转)

      有时我们在winform项目中嵌入了网页,想通过html页面调用后台方法,如何实现呢?其实很简单,主要有三部:   1.在被调用方法类上加上[ComVisible(true)]标签,意思就是当前类 ...

  7. JAVA对图片的任意角度旋转,以及镜像操作

    package relevantTest;/* * 该代码实现了对图像的水平镜像变换,垂直镜像变换,任意角度旋转,jtf的实时监控,以及对图像的缩放变换,以及按钮的若隐若现效果. * 在对图像进行任意 ...

  8. redis-dev

    redis install by centos   -------------------------------------------------------------------------- ...

  9. Solidworks直接打开SWB文件报错怎么办

       

  10. OS 获取用户相册。保存图片。编辑图片为圆形

    // // ViewController.m // YunPhoto // // Created by qingyun on 3/4/14. // Copyright (c) 2014 qingyun ...