您的位置:首页 > 其它

再次探究复制问题的解法.

2015-11-26 15:18 183 查看

如何将一个字符迅速复制粘贴到N个字符?同样采取动态规划的方法,但是这次的方法更加基础和容易理解.虽然效率变差了.

我们将建造一个状态空间,它有两个变量,当前的字数和粘贴板上面的字数.可以考虑到所求为F
[M],M应该小于等于N/2;注意到当
M<N/3
时,它可能是由F[N-1][M]写入一个字符得到,也可能是由F[N-M][M]进行一次粘贴得到.当M>N/3时,它只可能是由F[N-1][M]得到的.同时注意F
[N/2]的计算比较特殊,它是由min{F[N/2]k}+4得到:选中,复制,粘贴2次.

#include "iostream"
#include "vector"
#include "algorithm"
using namespace std;
int main()
{
vector<vector<int>> F;
vector<int> T;
F.resize(101);
T.resize(101);
T[0] = 0;
T[1] = 1;
F[1] = { 1,2 };
for (int i = 2; i != 101; ++i)
{
F[i].resize(i/2 + 1,1000);
F[i][0] = i;
for (int j = 1; j != i/3 +1 ; ++j)
F[i][j] = min(F[i - j][j] + 1,F[i-1][j]+1);
for (int j = i / 3 + 1; j <= (i / 2)-1; ++j)
F[i][j] = F[i - 1][j] + 1;

if (!(i%2))
F[i][i/2] = min(F[i][i/2],T[i/2] + 4);

T[i] = *min_element(F[i].begin(), F[i].end());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: