UVa 10069 Distinct Subsequences(經典DP)


題意:

給定2個字符串a, b,求b在a中出現的次數。要求可以是不連續的,但是b在a中的順序必須和b以前的一致。

思路:

類似於數字分解的題目。dp[i][j]表示:b的前j個字符在a的前i個字符中出現的次數。

似乎這種表示方法司空見慣,但是一開始我還真沒能搞懂如何去遞推。事情的真相是:

如果a[i] == b[j]則 dp[i][j] = dp[i-1][j] + dp[i-1][j-1]

如果a[i] != b[j]則 dp[i][j] = dp[i-1][j]

有種似曾相識的感覺,沒錯,這種遞推的策略就和POJ 1221數字分解差不多:給定數n,把其分解成1-m數字相加之和。

其實本題可以轉換成一維的數組,但是初始化有點撇腳。精力有限,於是就沒這么做。

參考了博客http://www.cppblog.com/syhd142/articles/117881.html

強大的c++封裝與重載,慢慢的掌握。

ps:上次師兄面試說問到類中const和非const的區別。在本題中可以比較好的體現:

const修飾的函數只能const類型的才能調用。非const只能調用非const函數。但是關於const的理解還有待於加深。

#include <cstdio> #include <cstdlib> #include <cstring>

const int MAXN = 10010; const int BASE = 1000000000; struct bignum { int len; int data[30]; bignum() : len(0) { } bignum(const bignum &v) : len(v.len) { memcpy(data, v.data, len * sizeof(int)); } bignum(int v) : len(0) { while (v > 0) data[len++] = v % BASE, v /= BASE; } bignum &operator = (const bignum &v) { len = v.len; memcpy(data, v.data, len * sizeof(int)); return *this; } int &operator [] (int i) { return data[i]; } int operator [] (int i) const { return data[i]; } }; bignum operator + (const bignum &a, const bignum &b) { bignum r; int i, carry = 0; for (i = 0; i < a.len || i < b.len || 0 < carry; ++i) { if (i < a.len) carry += a[i]; if (i < b.len) carry += b[i]; r[i] = carry % BASE; carry /= BASE; } r.len = i; return r; } bignum dp[MAXN][105]; char src[MAXN], dst[MAXN]; int main() { int cases; scanf("%d%*c", &cases); while (cases--) { gets(src + 1); gets(dst + 1); int ls, ld; ls = strlen(src + 1); ld = strlen(dst + 1); int c = 0; for (int i = 1; i <= ls; ++i) if (src[i] == dst[1]) dp[i][1] = bignum(++c); else dp[i][1] = bignum(c); for (int i = 2; i <= ls; ++i) { for (int j = 2; j <= ld; ++j) { dp[i][j] = dp[i-1][j]; if (src[i] == dst[j]) dp[i][j] = dp[i][j] + dp[i-1][j-1]; } } for (int i = dp[ls][ld].len - 1; i >= 0; --i) printf("%d", dp[ls][ld][i]); printf("\n"); } return 0; }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM