cogs1667 SGU422 傻叉小明打字

2022-04-29 23:54:10 字數 1948 閱讀 2152

其實和cf498bname that tune差不多

題意:現在需要依次輸入n個字元,第i個字元輸入的時候有pi的概率輸錯,不論是第幾次輸入(0<=pi<=0.5).每輸入乙個字元的用時為1.任意時刻都可以花費t的時間檢查之前輸入的字元有無錯誤(不論檢查多少個字元,t的數值都是一樣的),如果有錯誤就需要一次一次刪除字元直到所有錯誤字元都被刪除(只能從最後面往前刪,如果第i個位置出錯,那麼第i個位置之後的所有字元無論對不對都必須被刪除).如果採取最優策略,問將全部字元正確輸入的期望時間.

分析:這裡我們輸入字元之後還必須通過檢查確保輸入的字元是正確的,那麼在狀態定義的時候就要體現這一點.如果定義f[i]為輸入前i個字元並確保前i個字元正確的期望時間,將不容易轉移.概率期望的題常常採用」逆序定義狀態」,那麼這道題中就定義f[i]為已經輸入前n-i個字元並確保前n-i個字元正確時,再輸入剩下的i個字元並確保它們正確所需的最優策略下期望時間.注意這裡定義的是」最後i個字元的期望用時」而不是」前i個字元的期望用時」.顯然,如果當前已經確保前n-i個字元正確,之後前n-i個字元就不會再發生變化了,如果後面的字元出錯我們不需要刪除已經確定正確的字元.

接下來考慮如何轉移.我們進行的操作序列一定是:打幾個字元,檢查一次並進行必要的刪除,打幾個字元,檢查一次並進行必要的刪除,打幾個字元檢查一次並進行必要的刪除.那麼我們可以進行的決策就是下一次檢查之前打多少個字元:是打1個字元再檢查一次,還是打2個字元再檢查一次.於是我們想到列舉下一次檢查之前打的字元個數x.影響我們下一步行動的只有第乙個錯誤出現的位置,那麼當下一步打x個字元時(x<=i), f[i]=p(第乙個錯誤出現在第1個字元)*(x+t+x+f[i])+p(第乙個錯誤出現在第2個字元)*(x+t+x-1+f[i-1])+…+p(第乙個錯誤出現在第x個字元)*(x+t+1+f[i-x+1])+p(不出現錯誤)*(x+t+f[i-x])

將式子右邊的f[i]移項,就可以dp了.

注意即使不出現錯誤,我們也是在花費t的時間檢查之後才能確保沒有出現錯誤.

邊界顯然是f[0]=0

列舉f[i]對應的所有x值時,可以處理一下」第乙個錯誤出現在第j個字元的概率」,注意乙個細節:」打j個字元且沒有出錯」和」打j+1個字元且第乙個錯誤出現在第j+1個字元」的概率是不同的.那麼我們得到了乙個o(n^3)的dp,但這樣是不能通過的,需要優化.

仔細觀察剛才得到的式子:

f[i]=p(第乙個錯誤出現在第1個字元)*(x+t+x+f[i])+p(第乙個錯誤出現在第2個字元)*(x+t+x-1+f[i-1])+…+p(第乙個錯誤出現在第x個字元)*(x+t+1+f[i-x+1])+p(不出現錯誤)*(x+t+f[i-x])

我們發現,p(第乙個錯誤出現在第1個字元)對於x=1,2,3…是相同的,p(第乙個錯誤出現在第2個字元)對於x=2,3…是相同的,這暗示我們o(n^3)的做法中有大量可以省去的重複計算.

如果打x+1個字元再進行檢查,則

f[i]=p(第乙個錯誤出現在第1個字元)*(x+1+t+x+1+f[i])+p(第乙個錯誤出現在第2個字元)*(x+1+t+x+f[i-1])+…+p(第乙個錯誤出現在第x個字元)*(x+1+t+2+f[i-x+1])+p(第乙個錯誤出現在第x+1個字元)*(x+1+t+1+f[i-x])+p(不出現錯誤)*(x+t+f[i-x-1])

//這式子鬼知道打沒打錯…

然後我們發現打x字元和打x+1個字元之間的變化是可以o(1)算出來的,那麼我們就可以對每個i選擇最優的x,o(n^2)從f[0]推到f[n]了…

#include#include

using

namespace

std;

const

int maxn=3005

;double

f[maxn],p[maxn],p[maxn];

intmain()

} printf(

"%.6f\n

",f[n]);

fclose(stdin);fclose(stdout);

return0;

}

166 分數到小數

給定兩個整數,分別表示分數的分子 numerator 和分母 denominator,以字串形式返回小數。如果小數部分為迴圈小數,則將迴圈的部分括在括號內。示例 1 輸入 numerator 1,denominator 2 輸出 0.5 思路 注釋 public string fractiontod...

166 分數到小數

這題真的挺難的,主要難在數學,雜湊表的使用倒是很淺顯,我也是看了別人的思路再自己寫的。a b,a為被除數 b為除數 思路就是把所有補0的被除數都放入雜湊表,對應的鍵值是當前字串的長度。若出現相同的補過0的被除數則代表接下來除法的結果會開始迴圈,則跳出迴圈並在對應位置加括號輸出。幾個要判斷的地方 1....

COGS血帆海盜

對於已經增廣後的圖,會出現一些反向邊,首先跑一邊最大流,只有對於被增廣的路才有可能成為答案,考慮每一條被曾廣的路,如果他在殘留網路中兩個端點在同乙個強連通分量裡,必然有其他的路徑可以代替這條邊,比如圖中1 2 3 4 構成乙個環3 2 1 4 3,3 2可以替代原來的1 2,所以只有那些被增廣後,起...