一、題目描述
二、題目分析
三、**
由於業績優秀,公司給小q放了 n 天的假,身為工作狂的小q打算在在假期中工作、鍛鍊或者休息。他有個奇怪的習慣:不會連續兩天工作或鍛鍊。只有當公司營業時,小q才能去工作,只有當健身房營業時,小q才能去健身,小q一天只能幹一件事。給出假期中公司,健身房的營業情況,求小q最少需要休息幾天。
輸入描述:
第一行乙個整數 表示放假天數
第二行 n 個數 每個數為0或1
,第 i 個數表示公司在第 i 天是否營業
第三行 n 個數 每個數為0或1
,第 i 個數表示健身房在第 i 天是否營業
(1為營業 0為不營業)
輸出描述:
乙個整數,表示小q休息的最少天數
輸入例子1:
411
0001
10
輸出例子1:
2
例子說明1:
小q可以在第一天工作,第二天或第三天健身,小q最少休息2天
這顯然是一道動規題,我們可以選擇讓小q工作或者鍛鍊的時間最長從而讓小q的休息時間最少
先捋一下動規的步驟:
第⼀步, ⼀定要明確 dp 陣列的含義
首先我們需要明確動規的狀態
:顯然只有三種狀態:工作、鍛鍊、休息
,那麼我們怎麼在dp陣列中表示出來呢??
其實還有一種狀態,就是休假的天數
,因為天數是在動態變化的,所以也需要記錄,而工作、鍛鍊、休息
中不會出現連續的鍛鍊和工作,所以可以用乙個二維陣列來表示:dp[
i][j
]dp[i][j]
dp[i][
j]= ==k
kk;意思是:在第i天j狀態下最小的休息天數
規定:dp[
i][0
]dp[i][0]
dp[i][
0]代表在第i天休息的情況下小q最少的休息天數;
d p[
i][1
]dp[i][1]
dp[i][
1]代表在第i天鍛鍊的情況下小q最少的休息天數;
d p[
i][2
]dp[i][2]
dp[i][
2]代表在第i天工作的情況下小q最少的休息天數;
如:dp[3][0] = k;代表第3天休息的情況下小q的最少休息天數為k;
第⼆步, 定義 base case
dp陣列出來了,base case就比較簡單了dp[
0][0
]=
0dp[0][0] = 0
dp[0][
0]=0
d p[
0][1
]=
0dp[0][1] = 0
dp[0][
1]=0
d p[
0][2
]=
0dp[0][2] = 0
dp[0][
2]=0
還沒開始休假整個錘子~~~~
第三步, 找狀態轉移⽅程
到這裡我們就需要找狀態轉移方程
最後我們要求的結果就儲存在min
(dp[
n][0
],mi
n(dp
[n][
1],d
p[n]
[2])
)min(dp[n][0], min(dp[n][1], dp[n][2]))
min(dp
[n][
0],m
in(d
p[n]
[1],
dp[n
][2]
))中
# include
# include
# include
using
namespace std;
intmain()
if( work[i-1]
==1)//可以休息,選工作和鍛鍊最小的 +1
dp[i][0
]=min(dp[i-1]
[0],
min(dp[i-1]
[1], dp[i-1]
[2])
)+1;
}//返回結果
int res =
min(dp[n][0
],min(dp[n][1
], dp[n][2
]));
cout<}}
騰訊2020校園招聘 後台
小q在週末的時候和他的小夥伴來到大城市逛街,一條步行街上有很多高樓,共有n座高樓排成一行。小q從第一棟一直走到了最後一棟,小q從來都沒有見到這麼多的樓,所以他想知道他在每棟樓的位置處能看到多少棟樓呢?當前面的樓的高度大於等於後面的樓時,後面的樓將被擋住 輸入描述 輸入第一行將包含乙個數字n,代表樓的...
騰訊2020校園招聘 後台(3)
乙個簡單的動態規劃,注釋寫的很明白了 var n parseint readline var p1 newarray n var p2 newarray n var line readline var lines line.split for let i 0 i n i line readline ...
騰訊2020校園招聘 後台 程式設計題
a 壓縮演算法 做法 遞迴處理每個匹配的 中的單詞,再拼接起來。b 逛街 做法 假設現在在i樓,一定可以看到i 1和i 1的樓,i 往左看是形成的序列是乙個單調增的序列,用單調棧可以求出離當前樓最近,而且高度還要高於當前樓的樓。c 逆序對 做法 把序列的歸併樹畫出來,每一層是由許多段構成的。而每一層...