您的位置:首页 > 其它

leetcode 650. 2 Keys Keyboard(dp)

2017-08-20 09:40 281 查看
题意:

初始只给你一个字符,你可以进行两种操作:

1.复制当前你拥有的所有字符到粘贴版

2.把粘贴版上的字符粘贴到当前你拥有的字符的末尾。

给你一个参数n,问你最少用几次操作能让你拥有n个字符。

思路:

dp,从拥有2个字符的最少操作开始求,状态转移方程:如果当前要求的字符数是之前求过的某个字符数的倍数,那么当前的操作数可以是(当前状态为i,i为j的倍数):拥有j个字符的操作数,加上i/j(1次复制,i/j-1次粘贴,可以很容易推出来),即:dp[i] = min(dp[i],dp[j]+i/j);

代码:

class Solution {
public:
int minSteps(int n) {
if(n<2)
return 0;
int dp[n+1];
memset(dp,0x3f,sizeof(dp));
dp[0] = 0,dp[1] = 0;
for(int i = 2;i<=n;i++)
{
for(int j = 1;j<i;j++)
{
if(i%j==0)
dp[i] = min(dp[i],dp[j]+i/j);
}
}
return dp
;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: