zoukankan      html  css  js  c++  java
  • hdu5791 TWO

    hdu5791 TWO

    题意

    给你两个数串
    问你两个数串有多少子串一致
    子串不一定是连续的

    解法

    我们设 (dp[i][j]) 表示A串匹配到 i 位,B串匹配到 j 位,一致的子串数。那么我们有转移方程:
    (dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1])
    而如果 (a[i]==b[j]) 的话,我们还要加上 (dp[i-1][j-1] + 1) 。这样就完了。

    代码

    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <cctype>
    #include <vector>
    #define INF 2139062143
    #define MAX 0x7ffffffffffffff
    #define del(a,b) memset(a,b,sizeof(a))
    using namespace std;
    typedef long long ll;
    template
    inline void read(T&x)
    {
    x=0;T k=1;char c=getchar();
    while(!isdigit(c)){if(c=='-')k=-1;c=getchar();}
    while(isdigit(c)){x=x*10+c-'0';c=getchar();}x*=k;
    }
    const int maxn=1000+5;
    const int mod=1e9+7;
    int mul(int x,int y) {return 1ll*x*y%mod;}
    int add(int x,int y) {return (x+y)%mod;}
    int pul(int x,int y) {return (x-y+mod)%mod;}
    int dp[maxn][maxn];
    int a[maxn],b[maxn];
    int n,m;
    
    int main()
    {
    while(~scanf("%d %d",&n,&m)) {
    del(dp,0);
    for(int i=1;i<=n;i++) read(a[i]);
    for(int i=1;i<=m;i++) read(b[i]);
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++){
    if(a[i]!=b[j])
    dp[i][j]=pul(add(dp[i-1][j],dp[i][j-1]),dp[i-1][j-1]);
    else
    dp[i][j]=add(add(dp[i-1][j],dp[i][j-1]),1);
    }
    printf("%d
    ",dp[n][m]);
    }
    return 0;
    }
    
  • 相关阅读:
    【VirtualBox】共享文件夹失效问题
    【Ubuntu】全局代理
    phpStudy(lnmp)集成环境安装
    MemcacheQ 的安装与使用
    Windows 64位下安装Redis详细教程
    http与https的区别
    cookie 和session 的区别详解
    setcookie各个参数详解
    MySQL 数据备份与还原
    linux命令行下导出导入.sql文件
  • 原文地址:https://www.cnblogs.com/mrasd/p/9550306.html
Copyright © 2011-2022 走看看