zoukankan      html  css  js  c++  java
  • HDU 5791 Two 2016多校第五场1011 LCS

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5791
    题意:给你两个正整数序列,求他们相同公共子序列的个数(下标可以不同)。
    题解:找两个串的公共部分,本来以为YY能过,但是越想越复杂,而且根本没往LCS上想。本题正解就是LCS。dp[i][j]表示A序列前i个数和B序列前j个数的相同子序列对有多少个。
    从LCS的递推的方式来看,dp[i][j]包括了dp[i-1][j]、dp[i][j-1]和dp[i-1][j-1]。而dp[i-1][j]、dp[i][j-1]同时包含了dp[i-1][j-1],在计算的过程中去掉重复即可。
    代码如下:

    #include <bits/stdc++.h>
    using namespace std;
    
    typedef long long ll;
    const ll mod=1e9+7;
    int n,m;
    int ar1[1005];
    int ar2[1005];
    ll dp[1005][1005];
    
    int main()
    {
    	//freopen("in.txt","r",stdin);
    	while(~scanf("%d%d",&n,&m))
    	{
    		memset(dp,0,sizeof(dp));
    		for(int i=1;i<=n;i++)
    			scanf("%d",ar1+i);
    		for(int i=1;i<=m;i++)
    			scanf("%d",ar2+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(ar1[i]==ar2[j])
    					dp[i][j]=(dp[i-1][j-1]+dp[i][j]+1)%mod;
    			}
    		printf("%I64d
    ",dp[n][m]);
    	}
    	return 0;
    }
    
    
  • 相关阅读:
    js加载优化三
    js加载优化-二
    js加载优化
    怎样获取元素的高度
    HttpClient
    Android Http请求方法汇总
    table列等宽
    单页面手机开发
    单页面
    【154】C#打包程序成安装包
  • 原文地址:https://www.cnblogs.com/zhuyutian/p/5818449.html
Copyright © 2011-2022 走看看