創作內容

0 GP

cf Edu#94 (Div. 2) pD Zigzags

作者:瘋頭是笨蛋│2020-09-08 21:51:38│巴幣:0│人氣:113
抄了某位大大的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 手法
在賽中確認可行性 並在短時間喇出來
還得再多多努力

不知道我這樣有沒有講清楚
有可能之後再回去看的時候 會再修
歡迎大家留言指教
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=4910101
All rights reserved. 版權所有,保留一切權利

相關創作

留言共 2 篇留言

路過的一隻山姆
電 後來覺得這題其實滿簡單的

09-08 21:52

瘋頭是笨蛋
乾 你也回太快。其實我原本想發剛剛解的leetcode題,然後發現巴哈有這題的備份,然後我又很快的搞懂 才改發這篇的09-08 21:55
瘋頭是笨蛋
還有好多題目我覺得不錯,幾乎是有點難度,我要看解答才喇的出來,多到懶得發了= = 先洗澡 洗完打cf 希望能上藍09-08 21:57
雞塊
cf是指Crash fever嗎

09-09 02:20

瘋頭是笨蛋
https://truth.bahamut.com.tw/s01/201506/9e408fbb9cfcf2acc293e2ede2491c03.JPG?w=30009-09 08:39
我要留言提醒:您尚未登入,請先登入再留言

喜歡★terryobeyes 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:廢言佳句... 後一篇:決策樹視覺化工具 gra...

追蹤私訊切換新版閱覽

作品資料夾

happy545午安阿~~
歡迎大家來看看纏繞畫,如果喜歡歡迎私底下跟ˇ我說喔~。看更多我要大聲說22分前


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

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