uva10069 - Distinct Subsequences(大數+DP)

來源:互聯網
上載者:User

標籤:http   os   io   for   ar   代碼   amp   line   size   

題目:uva10069 - Distinct Subsequences(大數+DP)


題目大意:給出字串A , B。問能夠在A中找到多少子串B,可以不連續。


解題思路:dp【i】【j】 代表從i位開始的B串在從j位開始的A串中能夠找到多少種。

                 B【i】 == A【j】 dp【i】【j】 = dp【i - 1】【j - 1】 + dp【i】【j - 1】;

                 B【i】 != A【j】 dp【i】【j】 = dp【i】【j - 1】;邊界要處理一下。就是B中只有最後的那個字元來和A匹配的情況要處理一下。

                 10^100。要用大數。


代碼:

#include <cstdio>#include <cstring>#include <string>const int N = 10005;const int M = 105;const int base = 100000;char s1[N], s2[M];int max (const int a, const int b) { return a > b ? a: b; }struct bign {int len, s[30];bign () { memset (s, 0, sizeof (s));}bign (int num) { *this = num;}bign (const bign& b) { *this = b;}bign operator = (int num);bign operator + (const bign& b);bign operator + (const int b);bign operator += (const bign& b);void DelZore ();} dp[M][N];void bign::DelZore () {while (len >= 0 && s[len - 1] == 0) {len--;}if (len == 0)len = 1;}bign bign::operator = (int num) {if (num == 0) {len = 1;s[0] = 0;} else {len = 0;while (num > 0) {s[len++] = num % base;num = num / base;}}return * this;}bign bign::operator + (const bign& b) {bign c;c.len = 0;for (int i = 0, g = 0; g || i < max(len, b.len); i++) {int x = g;if (i < len) x += s[i];if (i < b.len) x += b.s[i];c.s[c.len++] = x % base;g = x / base;}return c;}bign bign::operator + (const int b) {bign b1;b1 = b;return *this + b1;}bign bign::operator += (const bign& b) {*this = *this + b;return *this;}int main () {int t, l1, l2;scanf ("%d%*c", &t);while (t--) {gets(s1);gets(s2);l1 = strlen (s1);l2 = strlen (s2);if (l2 == 0) {printf ("0\n");continue;}for (int i = 0; i < l2; i++) {dp[i][l1] = 0;}for (int i = l1 - 1; i >= 0; i--) {if (s1[i] == s2[l2 - 1]) dp[l2 - 1][i] = dp[l2 - 1][i + 1] + 1;elsedp[l2 - 1][i] = dp[l2 - 1][i + 1];}for (int i = l2 - 2; i >= 0; i--)for (int j = l1 - 1; j >= 0; j--) {dp[i][j] = dp[i][j + 1];if (s2[i] == s1[j])dp[i][j] += dp[i + 1][j + 1];}dp[0][0].DelZore();printf ("%d", dp[0][0].s[dp[0][0].len - 1]);for (int i = dp[0][0].len - 2; i >= 0; i--)printf ("%05d", dp[0][0].s[i]);printf ("\n");}return 0;}


 

uva10069 - Distinct Subsequences(大數+DP)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.