zoukankan      html  css  js  c++  java
  • Two (DP)

      题意:求两串数字有多少个相同的子串,子串不要求连续。

      思路:直接DP,dp[i][j] 代表A串长度为i、B串为j时满足条件的子串个数。转移dp[i][j] = dp[i -1][j] + dp[i][j - 1] - dp[i - 1][j - 1].后面是因为重复而减去的。

    #include<bits/stdc++.h>
    using namespace std;
    
    const int maxn = 1e3 + 7;
    const int mod  = 1e9 + 7;
    int n, m, a[maxn], b[maxn], dp[maxn][maxn];
    
    int main(){
        while(~scanf("%d%d", &n, &m)) {
            for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
            for(int i = 1; i <= m; i ++) scanf("%d", &b[i]);
    
            for(int i = 1; i <= n; i ++) {
                for(int j = 1; j <= m; j ++) {
                    dp[i][j] = ((dp[i - 1][j] + dp[i][j - 1] - dp[i - 1][j - 1]) % mod + mod) % mod;
                    if(a[i] == b[j]) dp[i][j] = (dp[i][j] + dp[i -1][j - 1] + 1) % mod;
                }
            }
            printf("%d
    ", dp[n][m]);
        }
        return 0;
    }
    more crazy more get!
  • 相关阅读:
    01:求平均年龄
    09:与圆相关的计算
    08:温度表达转化
    07:计算多项式的值
    06:甲流疫情死亡率
    05:计算分数的浮点数值
    04:带余除法
    03:计算(a+b)/c的值
    02:计算(a+b)*c的值
    01:A+B问题
  • 原文地址:https://www.cnblogs.com/wethura/p/9900455.html
Copyright © 2011-2022 走看看