04day1
無窮的數列
找規律
【問題描述】
有一個無窮序列如下:
110100100010000100000…
請你找出這個無窮序列中指定位置上的數字。
【輸入】
第一行一個正整數 N,表示詢問次數;接下來的 N 行每行一個正整數 Ai,Ai 表示在序列中的位置。
【解題過程】
找規律就好了。對于一個給定的位置 P,可以發現如果 P 上的數字是 1,那么必然滿足 P-1 = x*(x+1)/2,那么判斷這個方程是否有整數解即可(開平方取整再乘)。
1 次 AC。
?
方程
動態規劃
【問題描述】
【輸入】
第一行是 n 和 c。
第二行是 n 個數,分別表示 a1, a2, ..., an。
【輸出】
輸出解的組數(結果對 999983 取模)。
【解題過程】
一開始真的沒思路啊,剛好數學在上排列組合,有個神奇的「隔板法」,差點誤入歧途。
然后想到了一個很奇葩的方法,用 f[i] 表示用這個式子組成 i 這個值有幾組解,則
f[i] = sum{ f[i-a[j]], 1<=j<=n }
看上去有點道理,然后其實是錯的。這種狀態轉移的方式無法判斷重復的情況,比如 b1 取 1,b2 取 1 是可以由兩種情況(1, 0 和 0, 1)推過來的,加的時候也就多加了。
然后居然想了將近一個小時才想到正解,我也是醉了。
用 f[i][j] 表示用 a1, a2, ..., ai 來組成 j 有多少組解,則
f[i][j] = f[i-1][j] + f[i-1][j-a[i]], 1<=j<=n
然后如果用上滾動數組的話,最后表現出來的代碼與上面那種錯誤方法幾乎完全一樣,只是外循環和內循環調換了一下。
然后聽到 lzw 大神說無限背包。然后就沒有然后了。
1 次 AC。
?
交錯匹配
動態規劃
【問題描述】
有兩排非負整數 A[1..N],B[1..M],如果 A[i]=B[j]=k,那么可以在 A[i]和 B[j]之間連一條線,稱為一條 k 匹配,每個數至多連一條線。另外,每個 k 匹配都必須恰好跟一個 r 匹配相交,且 k≠r。現在要求一個最大的匹配數。
例如:以下兩行數的最大匹配數為 8.一個數最多只能和一個數連線。
【輸入】
輸入文件第一行包含兩個正整數 n 和 m。
第二行 n 個自然數,表示 a[i]。
第三行 m 個自然數,表示 b[i]。
【數據規模】
30%的數據滿足 n,m≤30。
60%的數據滿足 n,m≤200。
100%的數據滿足 n,m≤1000,0<所有數≤32767。
【解題過程】
看到什么最大匹配的還以為是二分圖,嚇了一小跳。
然后從數據范圍來看幾乎可以肯定是 O(mn) 的動態規劃。
借鑒 LCS 的狀態表示,用 f(i, j) 表示 a1, ..., ai 與 b1, ..., bj 之間的最大匹配數,那么我們只要考慮 ai 與 bj 是否需要進行匹配。如果要進行匹配,那么只要在 bj 的左邊找與 ai 匹配的數、在 ai 的左邊找與 bj 匹配的數就能保證兩個匹配相交。很明顯,對于 ai 找 bj 左邊距離 bj 最近的那個匹配才可能是最優解,對于 bj 也應該找 ai 左邊最近的匹配。這個找匹配的過程我們可以事先進行預處理。用 p(i, j) 表示 ai 在 b1, b2, ..., bj 中離 bj 最近的那個匹配所在的位置,則可以進行遞推:
若 ai=bj,則 p(i, j) = j
否則,p(i, j) = p(i, j-1)
然后可以用 q(j, i) 表示 bj 在 a1, a2, ..., ai 中離 ai 最近的那個匹配的位置,遞推過程類似。
然后就可以寫出狀態轉移方程了,
f(i, j) = max{ f(q(j, i-1)-1, p(i, j-1)-1), f(i-1, j), f(i, j-1), f(i-1, j-1) }
初始得分 90 分。原因是把遞推的嵌套循環范圍寫錯了(這樣也能拿 90 分?)。
轉載于:https://www.cnblogs.com/lsdsjy/p/3982489.html
總結
- 上一篇: mysql数据库常用备份、恢复命令
- 下一篇: [041] 微信公众帐号开发教程第17篇