description
乙隻烏龜由於智商低下,它只會向左或向右走,不過它會遵循主人小h的指令:f(向前走一步),t(掉頭)。現在小h給出一串指令,由於小h有高超的計算能力,他可以馬上知道烏龜最後走到**。
為了難倒小h,他的好朋友小c就說,現在讓你修改其中n個指令,使得烏龜移動到離起點最遠的地方。(修改是指「t」變成「f」,或「f」變成「t」,可以對同乙個指令多次修改)。烏龜一開始在0點。
input
第1行:乙個字串s代表指令 (
0n≤100 )
接下來一行乙個整數n,表示要修改的指令個數 (0≤
n≤50 )
output
第1行:乙個整數,表示烏龜所能移動到的最遠距離。
sample input
ffftfff
2
sample output
6
題目解析
這道題是一道有些變化的 資源分配dp 問題——將 j 次修改機會分配在前 i 個命令中。有變動的是閱讀到某一命令時可以有向左或向右兩種情況,於是在原來的狀態陣列 (g[i][j] ) 中增加一維,表示閱讀到第i條指令時的方向(不妨設1向右,0向左)。
我們把烏龜爬的那一段直線抽象為乙個數軸,它一開始在原點,最後它離原點的距離即它行走到的位置的絕對值(絕對值的幾何意義),且由於一開始烏龜的方向並不影響最後的結果,我們不妨設烏龜一開始向右(正半軸)。這樣就有乙個問題——最後烏龜可以在數軸的正半軸,也可以在負半軸。那麼我們就需要分別存閱讀到第i條指令時的最小值和最大值——用 struct 存在一起。
那麼陣列就變成了這樣:
struct ans}g[100][50][2];
注意定義時用建構函式分別給最大、最小值初始化。
接下來就是常規的 記憶化搜尋 ,函式裡的每乙個引數都與陣列 g 一一對應。注意它的返回值也是 ans 。首先判斷邊界,當 len(當前閱讀到的指令位置,從0開始)<0 ,也就是指令全部閱讀完,就返回乙個 「空」 ,這裡的空是乙個 ans 變數,那麼我們就可以定義乙個變數(nothing)表示 「空」 ,然後經過記憶化優化。
我們定義兩個 ans 變數(f1 , f2)分別表示不改變當前指令的值和改變當前指令的值。然後根據當前指令時 f 還是 t 分2類。由於必須把機會用完(由於一條指令可以改無數次,且當一條指令改偶數次時該指令是不變的,所以必須保證最後還剩餘偶數次修改的機會),這裡有一種情況是不能不修改的——當閱讀到最後一條指令(len==0)時,剩餘奇數次機會;同樣有一種情況是必須不修改的——當閱讀到最後一條指令時,剩餘偶數次機會。排除這兩種情況後,得出 f1 , f2 的值。g 的 big 和 small 就分別對應 f1 和 f2 中的 big 的較大值和 small 的較小值。
最後輸出 g[len][n][1] 的 big 和 small 絕對值的最大值。
程式樣例
(卡了一點資料,節省空間)
/*lucky_glass*/
#include
#include
#include
#define max(a,b) (a>b? a:b)
#define min(a,b) (achar code[100];
struct ans
}g[100][50][2],nothing;
bool vis[100][50][2];
ans g(int len,int change,bool lr)
else
g[len][change][lr].big=max(f1.big,f2.big);g[len][change][lr].small=min(f1.small,f2.small);
return g[len][change][lr];
}int main()
c 考試題目
一 專案提問 題 1 實現根號,要求最終與目標值的精度不大於0.0001 2 原題,求集合的子集c 的虛函式?innodb引擎的索引結構?為什麼是b 樹?三條查詢語句是否命中聯合索引?同步非同步阻塞非阻塞?為什麼是三次握手 四次揮手?timewait的意義?二 專案提問tcp ip5層協議 列舉協議...
模擬賽 妖怪等級考試 題解
妖怪等級考試 給定乙個無向連通圖,求是否存在兩個點之間存在三條路徑,並要求輸出路徑。首先,如果兩個節點之間存在多條不相交路徑,就一定存在乙個環。所以,這題和找環相關。只有兩個環之間存在相交的邊,才說明有解。如圖 現在關鍵就是如何找到環。由於無向圖dfs後,只有樹邊和返祖邊,且只有返祖邊才會形成環,所...
Python考試題目記錄
考試時沒能完全寫出來,題目記不太清了,記錄一下,不知道答案對不對。僅做參考,不保證 的正確性!給出乙個列表l,找出支配元組 支配元組 列表l中有兩個元組t1,t2,if t1 0 t2 0 and t1 1 t2 1 and 至少有乙個元素,小於對應位置的元素 t1支配t2,要找t1 分析 1 先排...