PAT 1040 暴力和動態規劃

2021-10-04 10:09:10 字數 1085 閱讀 6720

求最長回文串

列舉所有點兩兩組合

判斷兩點之內是否是回文

列舉的時間複雜度是o(n ^ 2),判斷的時間複雜度是o(n),所以暴力的方法時間複雜度為o(n ^ 3)

#include

#include

#include

using

namespace std;

intmain()

if(start >= end) temp = j - i +1;

if(temp > ans) ans = temp;}}

printf

("%d"

, ans)

;}

只有乙個字元的時候,也是回文結構且回文長度為1,所以ans要初始化為1。

動態規劃做法是找到狀態轉移方程。

令dp[i][j]來表示i,j之間的串是否為回文串,則如果str[i] == str[j] && dp[i + 1][j - 1] == 1,就能保證當前i,j的串也是回文結構。

一開始所有的dp[i][i]都是1,然後可既得的更新就是dp[i][i + 1],這是可以直接初始化處理得到的

然後針對不同的長度進行判斷,所以設定長度l作為外迴圈變數

設定了l,則內迴圈中判斷的子串長度是相同的,只是判斷他們是否為回文結構,這樣就可以使得長度4使用長度3的結論,使狀態可以順利轉移不漏判。

#include

#include

#include

#include

using

namespace std;

const

int maxn =

1010

;int dp[maxn]

[maxn]

;int

main()

}}for(

int l =

3; l <= str.

size()

; l++)}

}printf

("%d"

, ans)

;return0;

}

C程式 PAT 1040 有幾個PAT

現給定字串,問一共可以形成多少個pat?輸入只有一行,包含乙個字串,長度不超過10 5 只包含p a t三種字母。在一行中輸出給定字串中包含多少個pat。由於結果可能比較大,只輸出對 1000000007 取餘數的結果。思路分析1 常規思路,從頭開始掃瞄字串,找到 p 然後就去找從此往後的 a 然後...

PAT 1040 有幾個PAT 25 分

現給定字串,問一共可以形成多少個 pat?輸入只有一行,包含乙個字串,長度不超過10 5,只包含 p a t 三種字母。在一行中輸出給定字串中包含多少個 pat。由於結果可能比較大,只輸出對 1000000007 取餘數的結果。一開始打算用三層for迴圈暴力解題,但是一看到字串長度,遂放棄了這個想法...

PAT 1040 有幾個PAT 25分

現給定字串,問一共可以形成多少個 pat?輸入格式 輸入只有一行,包含乙個字串,長度不超過10 5 只包含 p a t 三種字母。輸出格式 在一行中輸出給定字串中包含多少個 pat。由於結果可能比較大,只輸出對 1000000007 取餘數的結果。輸入樣例 輸出樣例 2題目分析 一開始很容易想到反覆...