hdu 5791 Two 二维前缀和

来源:互联网 发布:python opencv图像识别 编辑:程序博客网 时间:2024/06/06 16:37
Alice gets two sequences A and B. A easy problem comes. How many pair of sequence A' and sequence B' are same. For example, {1,2} and {1,2} are same. {1,2,4} and {1,4,2} are not same. A' is a subsequence of A. B' is a subsequence of B. The subsequnce can be not continuous. For example, {1,1,2} has 7 subsequences {1},{1},{2},{1,1},{1,2},{1,2},{1,1,2}. The answer can be very large. Output the answer mod 1000000007.

Input

The input contains multiple test cases. 

For each test case, the first line cantains two integers N,M(1N,M1000). The next line contains N integers. The next line followed M integers. All integers are between 1 and 1000.

Output

For each test case, output the answer mod 1000000007.


才发现这道题是多校的。。。感觉还是比较水的。

公式比较好推,我用dp[i][j]表示以a的第i位和b的第j位结尾的符合题意的子串的个数,sum【i】【j】则是dp的一个二维前缀和。二维前缀和怎么求呢?可以百度二维前缀和23333.

然后假如a【i】==b【j】那么dp【i】【j】=sum【i-1】【j-1】,否则为0,算出dp后更新sum的值。

另外还有一个坑点,WA了几发,就是出现负数要还原,这点在有mod的题目里很重要。

#include<stdio.h>#include<string.h>#include<iostream>#include<limits.h>#include<float.h>#include<algorithm>using namespace std;const int MOD=1000000007;int dp[1010][1010],sum[1010][1010],a[1010],b[1010],n,m;int main(void){    while(cin>>n>>m)    {        for(int i=1;i<=n;i++)            scanf("%d",&a[i]);        for(int i=1;i<=m;i++)            scanf("%d",&b[i]);        memset(dp,0,sizeof(dp));        memset(sum,0,sizeof(sum));        for(int i=1;i<=n;i++)        {            for(int j=1;j<=m;j++)            {                sum[i][j]=(sum[i-1][j]+sum[i][j-1]-sum[i-1][j-1])%MOD;                sum[i][j]=(sum[i][j]+MOD)%MOD;                if(a[i]==b[j])                    dp[i][j]=(sum[i-1][j-1]+1)%MOD;                else                    dp[i][j]=0;                sum[i][j]=(sum[i][j]+dp[i][j])%MOD;            }        }        cout<<sum[n][m]<<endl;    }    return 0;}


0 0
原创粉丝点击