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
;
}
};
初始只给你一个字符,你可以进行两种操作:
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
;
}
};
相关文章推荐
- Leetcode 650. 2 Keys Keyboard[medium]
- leetcode_650. 2 Keys Keyboard
- LeetCode -- 650. 2 Keys Keyboard
- [LeetCode] 650. 2 Keys Keyboard
- 【精】leetcode - 650. 2 Keys Keyboard 【动态规划 + 质数 & 非质数 + 简洁表达】
- Leetcode 650. 2 Keys Keyboard
- [LeetCode] 650. 2 Keys Keyboard
- leetcode 650. 2 Keys Keyboard
- LeetCode 650. 2 Keys Keyboard--动态规划
- LeetCode650. 2 Keys Keyboard
- leetcode 650. 2 Keys Keyboard 最小复制粘贴次数 + 深度优先遍历DFS
- [LeetCode] 650. 2 Keys Keyboard
- Leetcode: 650. 2 Keys Keyboard
- LeetCode | 650. 2 Keys Keyboard 数学原理题分析
- [LeetCode] 650. 2 Keys Keyboard 两键的键盘
- LeetCode650. 2 Keys Keyboard
- [Leetcode] 650. 2 Keys Keyboard 解题报告
- Leetcode 650. 2 Keys Keyboard 2指键盘 解题报告
- leetcode 650. 2 Keys Keyboard
- Leetcode 650. 2 Keys Keyboard