动态规划中级教程 651. 4 Keys Keyboard

探讨了如何通过有限次数的键盘操作(打印A、全选、复制、粘贴)来最大化屏幕上A字符的数量,并提供了解决方案的状态转移方程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

651. 4 Keys Keyboard

  • User Accepted:262
  • User Tried:454
  • Total Accepted:265
  • Total Submissions:928
  • Difficulty:Medium

Imagine you have a special keyboard with the following keys: 

Key 1: (A): Prints one 'A' on screen.

Key 2: (Ctrl-A): Select the whole screen.

Key 3: (Ctrl-C): Copy selection to buffer.

Key 4: (Ctrl-V): Print buffer on screen appending it after what has already been printed. 

Now, you can only press the keyboard for N times (with the above four keys), find out the maximum numbers of 'A' you can print on screen.

Example 1:

Input: N = 3
Output: 3
Explanation: 
We can at most get 3 A's on screen by pressing following key sequence:
A, A, A

Example 2:

Input: N = 7
Output: 9
Explanation: 
We can at most get 9 A's on screen by pressing following key sequence:
A, A, A, Ctrl A, Ctrl C, Ctrl V, Ctrl V

Note:

  1. 1 <= N <= 50 
  2. Answers will be in the range of 32-bit signed integer.
题目告诉我们我们有4种键盘操作
1打一个a
2全选
3ctrl+c(这个时候没有复制)
4复制

好了我们看到有4个步骤先简化一下问题
全选后选择1或者4都是没有意义的把2和3合并一下
接着虽然执行2和3后执行1是没有意义的但是我们也不合并4因为我们2-3-4-4这样操作
问题简化成
1.打一个a

2.全选+ctrl+c
3复制
接着我们先从小的问题规模开始分析
dp【1】=1(没问题吧)
dp【2】=dp【1】+1(复制不起,相当于从最优的dp【1】再执行一次打一个1)
dp【3】=dp【2】+1(复制不起, 相当于从最优的dp【2】再执行一次打一个1
dp【4】=dp【3】+1(一样复制不起)
dp【5】=dp【4】+1
dp【6】=max(dp【5】+1,dp【3】*2)我们开始和前面建立联系从dp【6】开始+号开始丧失竞争力(当然你把它写在状态转移里也可以)
dp【7】=max(dp【4】*2,dp【3】*3)
dp【8】=max(dp【5】*2,dp【4】*3,dp【3】*4)
状态转移我们写出来就可以;
class Solution {
public:
    int maxA(int N) {
        int dp[N+1];
        for(int i=0;i<=N;i++)
        {
            dp[i]=0;
        }
        dp[1]=1;
        for(int i=2;i<=N;i++)
        {
            if(i>5)
            { 
                for(int j=3;i-j>=i/2;j++)//这里可以这样优化也可以不优化你找》=0也可以ac
                {
                    dp[i]=max(dp[i],dp[i-j]*(j-1));
                }   
            }
            else
            {
                dp[i]=dp[i-1]+1;   
            }
        }
        return dp[N];
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值