您的位置:首页 > 其它

关于动态规划的一点理解

2016-03-17 21:32 417 查看
最近在学习Andrew Ng的机器学习过程,过于非监督学习一些算法的证明过程中用到了动态规划知识,做毕设涉及到字符串的匹配问题,也需要动态规划,所以今天特意去查资料看了动态规划的一些内容。动态规划我觉得可以结合一些例子来帮助自己理解动态规划,比如01背包问题,国王挖金矿问题,然后看看自己需要解决的问题和这些典型的问题对比有没有一些共性(其实也就是你的问题符不符合动态规划问题的一些特点),关于动态规划问题的特点,总结起来有六个。

1.最优子结构

2.子问题重叠

3.边界是否存在

4.子问题独立

5.做备忘录

6.时间分析

今天时间不够了,先写到这里,有时间再完善

附上求解字符串相似度的动态规划的C++实现:

#include<stdio.h>

#include<string.h>

#define MAX 1000

int dp[MAX][MAX]; ///dp[i][j]表示当前a[0..i-1]与b[0..j-1]的编辑距离

char *a="agbgd";

char *b="ggd";

int min(int t1,int t2,int t3) ///求三个数的最小值

{

int min;

min=t1<t2?t1:t2;

min=min<t3?min:t3;

return min;

}

int main()

{

int i,j;

int lena=strlen(a),lenb=strlen(b);

memset(dp,0,sizeof(dp));

for(i=0;i<=lena;i++) ///a作为行,当b为空串时

dp[0][i]=i;

for(i=0;i<=lenb;i++) ///b作为列,当a为空串时

dp[i][0]=i;

for(i=1;i<=lena;i++)

{

for(j=1;j<=lenb;j++)

{

if(*(a+i)==*(b+j)) ///相等时

dp[i][j]=dp[i-1][j-1];

else

dp[i][j]=1+min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1]); ///不相等时,取三种可能操作的最小数值+1

}

}

printf("编辑距离为:dis=%d\n",dp[lena][lenb]);

return ;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: