日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[动规] hihocoder 1149 回文字符序列

發布時間:2025/3/15 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [动规] hihocoder 1149 回文字符序列 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目大意

原題鏈接,給定字符串求回文子序列數量。字符串長度 $len \leq 1000 $。

算法思路

題干比較簡單,而且數據量不大,很容易想到使用遞推,關鍵在于如何定義遞推中間值和遞推式。博主做題的時候首先想到定義數組 \(r[][]\), $r[i][j], i\leq j $ 表示以字符 \(str[j]\) 結尾,在區間 \([i,j]\) 中的回文子序列數量,就可以得到遞推式 $ r[i][j] = 1 + r[i][j-1] + \sum_{k=i, str[k]=str[i]}^{j-1} {(1+r[k+1][j-1])} $. 遞推的代碼很好寫,提交之后發現超時,仔細分析,復雜度為 \(O(n^3)\),無奈重新想遞推關系。

吃過午飯,突然靈機一動,定義數組 \(r[i][j]\) 表示字符串區間 \([i,j]\) 內的回文子序列數量,
\[ \begin{equation} r[i][j] = \begin{cases} 0 & \mbox{if $ i > j $ }\\ 1 & \mbox{elif $ i = j $ }\\ r[i][j-1] + r[i+1][j] + 1 & \mbox{elif $ str[i] = str[j] $ }\\ r[i][j-1] + r[i+1][j] - r[i+1][j-1] & \mbox{if $ str[i] \neq str[j] $ } \end{cases} \end{equation} \]

大家注意 $r[i][j-1], r[i+1][j] $ 重復計算了區間 \([i+1,j-1]\)的回文子序列,應該減去,而\(str[i]=str[j]\) 情形時的1表示回文序列就是 \(str[i],str[j]\).這樣復雜度就是 \(O(n^2)\) 啦,不會超時。

然而提交的時候出現了WA,百思不得其解,在我開始懷疑人生的時候突然想到,題目中要求對結果取模,因此可能在做減法的時候出現負數!

代碼

#include <iostream> #include <string> #include <string.h> using namespace std;const int md = 100007;string str; int r[1004][1004]; // r[i][j] (i<=j) str([i,j]) str[j] int dp(int a, int b) {if (r[a][b] != -1)return r[a][b];if (a > b)r[a][b] = 0;else if (a == b)r[a][b] = 1;else {if (str[a] == str[b]) {r[a][b] = dp(a, b - 1) + dp(a + 1, b) + 1;}else {r[a][b] = dp(a, b - 1) + dp(a + 1, b) - dp(a+1, b-1);}}r[a][b] = (r[a][b] + 2 * md) % md; // 防止負數!return r[a][b]; }int main() {int t;cin >> t;getline(cin, str);for(int q=1;q<=t;q++) {memset(r, 0xff, sizeof(int)*1004*1004);getline(cin, str);int len = str.length();cout << "Case #" << q << ": " << dp(0, len - 1) << endl;}return 0; }

轉載于:https://www.cnblogs.com/lessmore/p/hihocoder-1149.html

總結

以上是生活随笔為你收集整理的[动规] hihocoder 1149 回文字符序列的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。