小屋創作

日誌2020-09-08 21:51

cf Edu#94 (Div. 2) pD Zigzags

作者:瘋頭是笨蛋

抄了某位大大的code之後
稍微修改一下後 發現其實程式碼超短的

題目 [我覺得有dp成分 但tag沒有]
題目敘述非常簡單
可以想像是在字串中計算呈現 abab 的子序列
(a = b) 的話 也算 (也就是4個都相同)

最暴力的就是 Cn取4
但這樣複雜度是 O(n⁴ / 120)
但其實能夠降到O(n²) (還能更快嗎?)
------------------------------
以下進入詳解


首先
這個題目其實等同於
在陣列中計算有幾對相同的pair
(對中的index不可重複, 兩個pair的位置不能交叉)
但我覺得這跟我要講的解法
想法上沒有什麼太大的關係
只是稍微提一下 (tutorial也有講到)

先上程式碼

  1. ans = 0
  2. count = [0] * 3007
  3. for i in range(n):
  4.     c = 0
  5.     for j in range(i + 1, n):
  6.         if arr[i] == arr[j]:
  7.             ans += c
  8.         c += count[arr[j]]
  9.     count[arr[i]] += 1

沒錯 扣掉一些IO的部分 就是那麼短
(而且我後來又改的很ppyy)

我們開個陣列 (也可用 map/dict)
count 用來記錄各個數字出現的次數
我們以 前綴/累加 的方式計算
負責統計之前出現的數字的次數
可以讓我們快速地做查詢 第一個 位置
而 arr[i] 代表 第二
也就是說我們枚舉陣列中的每個數字當作是 第二個

之後我們宣告一個變數 c
下一層 迭代每個數字 arr[j] 當作是 第三
然後回去找前面有幾個數字可以當 第一個
也就是在 count 裡面的值,然後加進 c
同時也順便把這 第三數看作是 第四
如果這 第四數字符合 (也就是他跟 第二數字一樣)
這時 c 的值就會被加進 ans

可以再仔細思考一下計算的正確性
------------------------------
過一陣子回去看 再來寫詳解
發現其實概念也沒有到很難
只是要想出這種優美的 dp 手法
在賽中確認可行性 並在短時間喇出來
還得再多多努力

不知道我這樣有沒有講清楚
有可能之後再回去看的時候 會再修
歡迎大家留言指教

0

2

LINE 分享

相關創作

【生活&調整】2024/05/05(日)、鬍鬚張&以及調整週

<2024.05.05更新> 終於"91等",可以帶炎魔了

【雜記】最近的超多委託圖p7

留言

開啟 APP

face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】