目录
一、题目
假设你有一个特殊的键盘,键盘上只有四个键,它们分别是:
A键 :在屏幕上显示一个A。
Ctrl_A键:选中整个屏幕。
Ctrl_C键:将选中的区域复制到缓冲区。
Ctrl_V键:将缓冲区的内容输出到光标所在的屏幕位置。
现在,你只能按键盘上N次(使用以上四个键),找出你可以在屏幕上打印的“A”的最大数量
二、分析
三、暴力递归
#include<iostream>
using namespace std;
int Function(int n,int A_num,int copy)
//分别表示剩余按键次数,屏幕上字符A的数量,剪切板中A的数量
{
if (n <= 0)
return A_num;
else
{
int x = Function(n - 1, A_num + 1, copy);//直接按下A键盘
int y = Function(n - 2, A_num, A_num);//按下Ctrl-A,Ctrl-C
int z = Function(n - 1, A_num + copy, copy);//按下Ctrl-V
int a = max(x, max(y, z));
return a;
}
}
int main()
{
int n;
cin >> n;
cout << Function(n, 0, 0);
return 0;
}
四、动态规划
#include<iostream>
#include<vector>
using namespace std;
int Function(int n)
//分别表示剩余按键次数,屏幕上字符A的数量,剪切板中A的数量
{
vector<int>dp(n + 1, 0);
dp[0] = 0;
for (int i = 1; i <= n; i++)
{
//按A键盘
dp[i] = dp[i - 1] + 1;
//按C-V键盘
for (int j = 2; j < i; j++)
{
dp[i] = max(dp[i], dp[j - 2] * (i - j + 1));
}
}
return dp[n];
}
int main()
{
int n;
cin >> n;
cout << Function(n);
return 0;
}