我承认自己有取巧的成分,这个不能算是最佳思路,我归纳了前10个,分析出来
1、小于6的情况下,dp[i]=i;
2、在超出6的情况下,dp[i]只有两种最大可能,要么是经过C-A,C-C,C-V,C-V,C-V要么是经过了C-A,C-C,C-
class Solution
{
public:
int fourkeys_keyboard(int n)
{
vector<int> dp(n + 1, 0);
for (int i = 1; i <= n; ++i)
{
dp[i] = i;
if (i > 6)
{
dp[i]=max(3*dp[i-4],4*dp[i-5]);
}
cout << dp[i] << " ";
}
return dp[n];
}
};
正常解法如下,应该是遍历两遍。复杂度稍高,但是这种更容易接受,实际上我上面写的,自己确实无法证明。
class Solution
{
public:
int fourkeys_keyboard(int n)
{
vector<int> dp(n + 1, 0);
for (int i = 1; i <= n; ++i)
{
dp[i]=dp[i-1]+1;
for(int j=2;j<i;j++)
dp[i]=max(dp[i],dp[j-2]*(i-j+1));
cout << dp[i] << " ";
}
cout<<endl;
return dp[n];
}
};