zoukankan      html  css  js  c++  java
  • LCS的数量

    题意:

    给出两个字符串,A,B,求A,B的lcs的数量。

    题解:

    在LCS的时候同时计算方案QAQ,可是傻逼的我不会,不会,不会。。。。。。

    代码:

    #include <cstdio>
    #include <cstring>
    #include <iostream>
    #include <algorithm>
    using namespace std;
    
    const int mod = 1e9 + 7;
    const int N = 1e3 + 7;
    int dp[N][N], sum[N][N];
    char ch1[N], ch2[N];
    
    int main () {
    	scanf ("%s%s", ch1 + 1, ch2 + 1);
    	int n = strlen (ch1 + 1);
    	int m = strlen (ch2 + 1);
    	for (int i = 0; i <= n; ++i) sum[i][0] = 1;
    	for (int j = 0; j <= m; j++) sum[0][j] = 1;
    		
    	for (int i = 1; i <= n; ++i) {
    		for (int j = 1; j <= m; ++j) {
    			if (dp[i][j] < dp[i - 1][j]) {
    				dp[i][j] = dp[i - 1][j];
    				sum[i][j] = sum[i - 1][j];
    			}
    			else if (dp[i][j] == dp[i - 1][j]) {
    				sum[i][j] = (sum[i][j] + sum[i - 1][j]) % mod;
    			}
    			if (dp[i][j] < dp[i][j - 1]) {
    				dp[i][j] = dp[i][j - 1];
    				sum[i][j] = sum[i][j - 1];
    			}
    			else if (dp[i][j] == dp[i][j - 1]) {
    				sum[i][j] = (sum[i][j] + sum[i][j - 1]) % mod;
    			}
    			if (ch1[i] == ch2[j]) {
    				if (dp[i][j] < dp[i - 1][j - 1] + 1) {
    					dp[i][j] = dp[i - 1][j - 1] + 1;
    					sum[i][j] = sum[i - 1][j - 1];
    				}
    				else if (dp[i][j] == dp[i - 1][j - 1] + 1) {
    					sum[i][j] = (sum[i][j] + sum[i - 1][j - 1]) % mod;
    				}
    			}
    		}
    	}
    	printf("%d
    ", sum[n][m]);
    	return 0;
    }
    

      

    总结:

    一个基础的DP,我竟然不会QAQ,我真为“志几”感到捉急...

  • 相关阅读:
    tomcat feign rocketmq 最大线程数
    rocketmq
    使用docker在linux上安装oracle数据库
    dnf 腾讯 解人脸
    记一次mysql慢查询优化
    python运行内存分析
    【转】【WPF】WPF强制刷新界面
    【转】【WPF】Grid显示边框线
    流媒体服务新手入门教程03--音视频基础
    流媒体服务新手入门教程02--m7s环境搭建
  • 原文地址:https://www.cnblogs.com/xgtao/p/5987098.html
Copyright © 2011-2022 走看看