cf835 預處理 記憶化dp

2022-02-19 18:44:48 字數 982 閱讀 6902

題意: 定義 k 度回文串為左半部分和右半部分為 k - 1 度的回文串 . 給出乙個字串 s, 問 1 ~ s.size() 度回文串的數目分別為多少 .

思路: 預處理 + 記憶化dp

可以先花 o(n^2) 的時間預處理一下所有字串是否為回文串 . 注意預處理時不能直接列舉 l, r, 不然會出現處理 [l, r] 時 [l + 1, r - 1] 並沒有先處理的情況 .不過換個思路, 列舉長度和左端點就好了 .

然後可以直接 dfs 出所有字串的回文度, 因為對於回文串其左右部分是一樣的, 所以每次 dfs 一半即可,

這裡還可以加個記憶優化, 能將複雜度從 o(n * n * log(n)) 降到 o(n * n).

最後注意一下對於度為 k 的串, 其也是度為 1 ~ k - 1 的串 .

**:

1 #include 2

using

namespace

std;34

const

int maxn = 5e3 + 10;5

int vis[maxn][maxn];//

vis[i][j]記錄[i,j]是否為回文串

6int dp[maxn][maxn];//

dp[i][j]記錄[i,j]的回文度

7int sol[maxn];//

sol[i]記錄回文度為i的子串數目89

int dfs(int l, int

r)17

18int main(void)27

for(int i = 3; i <= len; i++)31}

32for(int i = 0; i < len; i++)36}

37for(int i = len - 1; i > 0; i--)

40for(int i = 1; i <= len; i++)

43 cout <

44return0;

45 }

view code

CF835C Star sky(模擬 二維字首和)

題目大意 給你個100 100的棋盤,有些點上有點權,會隨時間改變。設點權為x x 10 則在時間t他的點權為 t x c 1 每次詢問給你時間t,和乙個矩陣範圍 x1,y1,x2,y2 問你矩陣覆蓋區域內的點權和是多少。因為棋盤範圍很小,權值種類也很少,所以我們預處理乙個陣列cnt k x y 表...

c 預處理和預處理命令

預處理發生在編譯之前,預處理輸出的是乙個單一的檔案,這個檔案被送到編譯器,進行編譯。每條預處理命令都控制預處理器的行為。每條預處理命令佔據一行,有以下的格式 character 預處理命令 one of define,undef,include,if,ifdef,ifndef,else,elif,e...

mysql 預處理語句 in MySQL預處理語句

預製語句的sql語法基於三個sql語句 prepare stmt name from preparable stmt execute stmt name using var name var name prepare stmt name prepare語句用於預備乙個語句,並賦予它名稱stmt na...