键盘特殊_特殊键盘

键盘特殊

Problem statement:

问题陈述:

Imagine you have a special keyboard with four types of keys:

想象一下,您有一个特殊的键盘,其中包含四种类型的键:

Key 1: Prints 'I' on screen

按键1:在屏幕上打印“ I”

Key 2: Select whatever printed in screen

键2:选择屏幕上打印的任何内容

Key 3: Copy selection to buffer

关键3:将选择复制到缓冲区

Key 4: Append buffer on-screen after what has already been printed. If you can only press the keyboard for N times (with the above four keys), write a program to produce maximum numbers of I's possible to be printed on the screen.

关键4:在已打印的内容之后在屏幕上追加缓冲区。 如果您只能按键盘N次(使用上述四个键),请编写一个程序以产生最大数量的I(可以在屏幕上打印)。

Input:

输入:

Input is N, number of times keys can be pressed in total.

输入为N ,总共可以按键的次数。

Output:

输出:

Print maximum number of I's possible to print

打印我可以打印的最大数量

Constraints:

限制条件:

1 ≤ N ≤ 75

Example:

例:

Input:
2

Output:
2

Explanation:
We can at most get 2 I's on screen by pressing 
following key sequence Key1, key1.
Pressing other keys have no effect. 
Like key 1, key2 will produce only one I on screen. 

Input:
7

Output:
9

Explanation:
We can at most get 9 I's on screen by pressing 
following key sequence.
Key1, Key1, Key1, Key2, Key3, key4, Key4

I //after pressing key1
I I  //again pressing key 1
I I I //again pressing key1
 
I I I //pressing key2 selects three I's
I I I // pressing key3 copies these three I's to buffer
I I I I I I // pressing key4 appends these three I's 
I I I I I I I I I // pressing key4 again appends these three I's 

Solution Approach:

解决方法:

Basically,

基本上,

Two things need to be understood to solve this problem

解决此问题需要了解两点

Key4 appends whatever is printed already on screen before 3 key pressing

按下3键之前, Key4会附加屏幕上已经打印的内容

That means at moment 4,

这意味着在第四时刻

You can append whatever was printed while moment 1 as to print in moment 4, you need to press key2 at moment 2 and key3 at moment 3.

您可以在第1时刻添加要在第4时刻打印的内容,然后在第2时刻按key2 ,在第3时刻按key3

So, the recursive function can be written as

因此,递归函数可以写成

Let,

让,

F(n) = max number of I’s printed on screen

F(n) =我在屏幕上打印的最大数量

So, for n>3

因此,对于n> 3

F(n) = max(f(j)*(n-j-1)) for 1<=j<=n-3

Where, 
F(j) = already printed characters up to moment j 
and (n-j-1) is number of appending possible   

So, now we need to convert the recursion into DP.

因此,现在我们需要将递归转换为DP。

1)  Initialize dp[n+1] like following base value;
2)  for i=0 to n
        dp[i]=i;
3)  Fill the DP table
        for i=4 to n
            for j=i-3 to 1,j--
                dp[i]=max(dp[i],dp[j]*(i-j-1));
            end for
        End for
4)  Return dp[n]

C++ Implementation:

C ++实现:

#include <bits/stdc++.h>
using namespace std;

int specialKeyboard(int n)
{

    int dp[n + 1];
    for (int i = 0; i <= n; i++)
        dp[i] = i;

    for (int i = 6; i <= n; i++) {
        for (int j = i - 3; j >= 1; j--) {
            dp[i] = std::max(dp[i], dp[j] * (i - j - 1));
        }
    }

    return dp[n];
}

int main()
{
    int t, n, item;

    cout << "Input n, number of times keys to be pressed: ";
    scanf("%d", &n);
    
    cout << "max no of i's got printed: " << specialKeyboard(n) << endl;

    return 0;
}

Output:

输出:

Input n, number of times keys to be pressed: 7
max no of i's got printed: 9


翻译自: https://www.includehelp.com/icp/special-keyboard.aspx

键盘特殊

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值