DP-LCS

最长公共子串LCS的使用

 

public class DP_LCS {
    public static void main(String[] args) {
        char[] A = {'s','a','d','s','t','o','r','y'};
        char[] B = {'a','d','m','i','n','s','t','o','r','y'};

        int dp[][] = new int[A.length+1][B.length+1];
        for(int i = 0;i<dp.length;i++){
            dp[i][0] = 0;
        }
        for (int j = 0;j<dp[0].length;j++){
            dp[0][j] = 0;
        }
        //dp[4][6]表示asds admins的LCS长度
        //假如A[4] == B[6]  dp[4][6] = dp[3][5]+1
        //否则dp[4][6] = max(dp[3][6],dp[4][5])
        //dp[3][6]为asd和admins
        //dp[4][5]为asds和admin
        for (int i = 1;i<A.length;i++){
            for (int j = 1;j<B.length;j++){
                if(A[i] == B[j]){
                    dp[i][j] = dp[i-1][j-1]+1;
                }else{
                    //这是为什么不是直接赋值以上的
                    //dp[i][j] = dp[i-1][j-1];
                    dp[i][j] = Integer.max(dp[i-1][j],dp[i][j-1]);
                }
                //System.out.println("i:"+i+" j: "+j+" dp: "+dp[i][j]);
            }
        }
        System.out.println(dp[A.length-1][B.length-1]);
    }
}

 

### 动态规划在C语言中的实现与示例 动态规划是一种通过分解问题并存储子问题解来优化计算的技术[^1]。它广泛应用于矩阵链乘法、装配线调度以及计算机国际象棋程序等领域。以下是关于如何在C语言中实现动态规划的一些核心概念和具体例子。 #### 核心概念 动态规划的核心在于两个方面:重叠子问题和最优子结构。对于具有这些特性的复杂问题,可以通过构建表格的方式逐步解决问题。这种方法通常涉及初始化边界条件、定义状态转移方程,并最终返回目标结果。 #### 实现步骤说明 虽然不使用诸如“首先”之类的引导词,但在描述过程中会自然体现逻辑顺序: - 定义数组用于保存中间结果。 - 初始化基础情况下的值。 - 使用循环迭代填充整个表。 - 返回所需的结果位置对应的数值。 下面给出几个经典的动态规划实例及其C代码展示。 #### 示例一:斐波那契数列(Fibonacci Sequence) ```c #include <stdio.h> int fibonacci(int n) { int f[n+2]; // Array declaration int i; /* Assigning base values */ f[0] = 0; f[1] = 1; for (i = 2; i <= n; i++) { f[i] = f[i-1] + f[i-2]; } return f[n]; } int main() { int n = 9; printf("Fibonacci number is %d\n", fibonacci(n)); return 0; } ``` 此段代码展示了利用动态规划解决斐波那契序列的方法。 #### 示例二:最长公共子序列(Longest Common Subsequence, LCS) 假设字符串X="AGGTAB" 和 Y="GXTXAYB". 要找到它们之间的LCS长度. ```c #include<stdio.h> #include<string.h> // Function to find length of Longest Common Subsequence between two strings X[] and Y[] int lcs(char *X, char *Y, int m, int n){ int L[m+1][n+1]; for (int i=0;i<=m;i++){ for (int j=0;j<=n;j++){ if(i==0 || j==0) L[i][j]=0; else if(X[i-1]==Y[j-1]) L[i][j]=L[i-1][j-1]+1; else L[i][j]=((L[i-1][j]>L[i][j-1])?L[i-1][j]:L[i][j-1]); } } return L[m][n]; } int main(){ char X[] = "AGGTAB"; char Y[] = "GXTXAYB"; int m=strlen(X); int n=strlen(Y); printf("Length of LCS is %d \n",lcs( X, Y,m,n )); return 0; } ``` 上述代码实现了寻找两串字符间的最长公共子序列的功能。 #### 教学理念关联 值得注意的是,在教授此类算法时应遵循先讲解原理再引入特定编程语言语法的教学策略[^2]。这样可以帮助学生更好地理解抽象的概念而不被具体的语法规则所干扰。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值