《王道》第10章 分治法、动态规划与贪心算法
目录
1 分治法
2 动态规划
例1
int c[100][100];
int LCS_LENGTH(const char *X, char *Y)
{
if (X == NULL && Y == NULL)
return 0;
int m = strlen(X);
int n = strlen(Y);
c[0][0] = 0;
for (int i = 1; i < m; i++)
c[i][0] = 0;
for (int i = 1; i < n; i++)
c[0][i] = 0;
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
if (X[i] == Y[j])
c[i][j] = c[i - 1][j - 1] + 1;
else
c[i][j] = max(c[i][j - 1], c[i - 1][j]);
}
}
return c[m][n];
}
例2
这样,可以写出如下递归程序:
#include <iostream>
#include <string.h>
using namespace std;
int minValue(int x, int y, int z)
{
if (x<y)
{
if (y < z)
return x;
else
return x < z ? x : z;
}
else
{
if (x < z)
return y;
else
return y < z ? y : z;
}
}
int calculateStringDistance(string strA, int pABegin, int pAEnd, string strB, int pBBegin, int pBEnd)
{
if (pABegin > pAEnd) //边界条件,strA处理完毕
{
if (pBBegin > pBEnd)
return 0;
else
return pBEnd - pBBegin + 1;
}
if (pBBegin > pBEnd) //边界条件,strB处理完毕
{
if (pABegin > pAEnd)
return 0;
else
return pAEnd - pABegin + 1;
}
if (strA[pABegin] == strB[pBBegin]) //如果strA的首字母等于strB的首字母
return calculateStringDistance(strA, pABegin + 1, pAEnd, strB, pBBegin + 1, pBEnd);
else
{
int t1 = calculateStringDistance(strA, pABegin + 1, pAEnd, strB, pBBegin, pBEnd);
int t2 = calculateStringDistance(strA, pABegin , pAEnd, strB, pBBegin + 1, pBEnd);
int t3 = calculateStringDistance(strA, pABegin + 1, pAEnd, strB, pBBegin + 1, pBEnd);
return minValue(t1, t2, t3) + 1;
}
}
3 贪心算法
练习1
练习2
练习3