HDU

来源:互联网 发布:微信订单管理系统源码 编辑:程序博客网 时间:2024/05/17 03:09

简单 dp 稍微推一下就出来了


可以画个n * m 的矩阵 手动推一下 a [ i ]  == b [ j ]  和 a [ i ] != b [ j ]  时的关系递推关系式


#include <iostream>#include <cstdio>#include <cstring>#include <cstdlib>#include <cmath>#include <set>#include <queue>#include <algorithm>#include <vector>#include <cctype>#include <stack>#include <sstream>#include <list>#include <map>#include <assert.h>#define debug() puts("************")#define MS(a,b) memset(a,b,sizeof a)using namespace std;typedef long long ll;typedef pair<int,int> P;const int INF = 0x3f3f3f3f;const double inf = 1e20;const double eps = 1e-15;const int dx[] = {-1,0,1,0};const int dy[] = {0,1,0,-1};const int maxn = 1000 + 7, maxd = 100000 + 7;const ll mod = 1e9+7;int n, m;int a[maxn], b[maxn];ll dp[maxn][maxn];void init() {    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);}void solve() {    for(int i = 1; i <= n; ++i) {        for(int j = 1; j <= m; ++j) {            if(a[i] == b[j]) dp[i][j] = (dp[i][j-1] + dp[i-1][j] + 1) % mod;            else dp[i][j] = (dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1] + mod) % mod;        }    }}int main() {    while(scanf("%d %d", &n, &m) != EOF && n+m) {        init();        solve();        printf("%lld\n", dp[n][m] % mod);    }    return 0;}