zoukankan      html  css  js  c++  java
  • 动态规划解最大公共子串

    子串是连续的

    一:刻画最优解结构特征

    用c[i,j]表示以a[i],b[j]结尾的最大公共子串中的字符数。则max(c[i,j]) (0<=i<=len(a)-1, 0<=j<=len(b)-1)表示a和b最大公共子串的字符数。同时在求解过程中可以确定i和j,这样也就确定了这个公共子串。

    二:递归定义最优解的值

    c[i,j]=c[i-1,j-1]+1, (a[i] = b[j])

    c[i,j] = 0, (a[i]<>b[j])

    三:自底向上的方法

    i和j递增

    四:构造最优解

    确定i,j和c[i,j],也就能反推出最大公共子串

    代码如下:

    #include<iostream>
    using namespace std;

    #define max(x,y) ((x)>(y)?(x):(y))
    int main()
    {
        int a[5] = {13,16,2,45,3};
        int b[10] = {4,5,2,7,16,2,45,6,7,3};
        int c[5][10];
        memset(&c, 0, sizeof(c));
        int q = -1;
        for(int i = 0; i<5; i++)
        {
            for(int j =0; j<10; j++)
            {
                if(a[i]==b[j])
                {
                    c[i][j] = c[i-1][j-1] + 1;
                }
                else
                {
                    c[i][j] = 0;
                }
                q = max(q,c[i][j]);    
            }
        }
        cout<<q<<endl;
        return 0;
    }

  • 相关阅读:
    java用write()拷贝一个文本文件
    java代码简单练习
    java代码GUI简单的。。。
    java"=="与equals()方法的对照
    java代码Math.sqrt
    java代码for循环+缓冲流类
    java代码JFrame练习
    java 代码。= -=
    java流类
    java代码throws异常
  • 原文地址:https://www.cnblogs.com/johnsblog/p/3481512.html
Copyright © 2011-2022 走看看