zoukankan      html  css  js  c++  java
  • 动态规划

    动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到的子问题往往不是互相独立的。若用分治法来解决这类问题,则分解得到的子问题数目太多,以至于最后解决原问题需要耗费指数时间。然而,不同子问题的数目常常只有多项式量级。在用分治法求解时,有些子问题被重复计算了许多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,从而得到多项式时间算法。为了达到此目的,可以用一个表来记录所有已解决的子问题的答案。不管子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划的基本思想。

    动态规划算法适用于解决最优化问题。通常可以按以下4个步骤设计:(1)找出最优解的性质,并刻画其结构特征。(2)递归地定义最优值。(3)以自底向下的方式计算出最优值。(4)根据计算最优值时得到的信息,构造最优解。

    以下是求解最长公共子序列的算法:

    #include<iostream>
    #include<string>
    #define N 20
    using namespace std;
    int d[N][N];
    int LCSlength(char *a,char *b,int c[][N])
    {
    int alen=strlen(a);
    int blen=strlen(b);
    for(int i=0;i<=alen;i++)
    c[i][0]=0;
    for(int j=0;j<=blen;j++)
    c[0][j]=0;
    for(i=1;i<=alen;i++)
    for(j=1;j<=blen;j++)
    if(a[i-1]==b[j-1])
    c[i][j]=c[i-1][j-1]+1;
    else
    c[i][j]=c[i][j-1]>c[i-1][j]?c[i][j-1]:c[i-1][j];
    return c[alen][blen];
    }
    char *LCS(char *s,char *a,char *b)
    {
    int c[N][N];
    int i=strlen(a);
    int j=strlen(b);
    int k=LCSlength(a,b,c);
    s[k]='';
    while(k>0)
    {
    if(c[i][j]==c[i-1][j])
    i--;
    else if(c[i][j]==c[i][j-1])
    j--;
    else
    {
    s[--k]=a[i-1];
    i--;
    j--;
    }
    }
    return s;
    }
    void main()
    {
    char *s=new char[N];
    char s1[N];
    char s2[N];
    cout<<"请输入第一个字符串:";
    cin>>s1;
    cout<<"请输入第二个字符串:";
    cin>>s2;
    cout<<"最长的公共子序列为:"<<LCS(s,s1,s2)<<endl;
    delete s;
    cout<<"长度为" <<LCSlength(s1,s2,d)<<endl;
    }

  • 相关阅读:
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    Security and Cryptography in Python
    微信小程序TodoList
    C语言88案例-找出数列中的最大值和最小值
    C语言88案例-使用指针的指针输出字符串
  • 原文地址:https://www.cnblogs.com/yinson/p/5428949.html
Copyright © 2011-2022 走看看