對於資料報,可能包含多條訊息,每條訊息前面加上乙個長度,這在每條訊息的前面附加乙個 4 位元組長度的 int 變數來儲存訊息的長度。對於長度恰好為 n 的位元組的資料報,總共有多少種可能的不同的訊息結構?我們定義不同為位置不同,和內容無關。比如說,對於長度為 10 的資料報,有下面 2 種可能的結構:
| 4 | 6 |
| 4 | 1 | 4 | 1 |
注意,在所有可能的結構中,訊息的長度不可以為 0。也就是說,不能出現這樣的訊息:| 4 | 0 |。
雖然牛牛很擅長寫程式,但是他不擅長數數,所以他把這個問題留給你了。當然,答案可能會很大,所以你需要給出答案模 998244353 之後的結果。
示例1複製
10複製
2思路:
思考經典爬樓梯問題,每次一步或者兩步,爬n級樓梯有多少種方法?
最後一次為爬1步,那麼剩餘為: f(n-1)
最後一次為爬2步,那麼剩餘為: f(n-2)
總共為:f(n-1)+f(n-2)
同理:容易知道每個訊息組:(長度4+訊息本身)最少為5個長度
若最後乙個訊息組長度為5 那麼f(n-5)
若最後乙個訊息組長度為6 那麼f(n-6)
若最後乙個訊息組長度為n-5 那麼f(5)
若所有的組合成乙個訊息組,那麼為1
f(1)=0,f(2)=0......f(5)=1
所以對於n>6
f(n)=f(n-5)+f(n-6).....+f(5)+1
f(n+1)=f(n-4)+f(n-5)....+f(5)+1
f(n+1)=f(n-4)+f(n) => f(n)=f(n-1)+f(n-5)
那麼只需要維持乙個5的佇列,每次向後計算即可
int messagecount(int n) ;
if(n<5)
return 0;
if(n==5)
return 1;
for(int i=6;i<=n;i++)
return q.back();
}
動態分配陣列
注意,刪除操作不會刪除該指標 它刪除指標所指向的記憶體!動態分配陣列 動態陣列的宣告讓我們執行程式時選擇自己的大小。動態分配陣列,我們使用新的和刪除陣列形式 通常稱為新的 和 刪除 123 4int nsize 12 int pnarray new int nsize note nsize does...
正則 匹配數字問題
今天遇到個需要用正則進行匹配的問題 輸入年薪,匹配可以為0,可以是正整數,也可以是小數,網上看了很多帖子,沒有能直接同時匹配的,0125 01.125 00.0 這種.總是匹配錯誤 作為正則小白,只能換個方法匹配2次。先去除小數點後多餘的0 public static string removeze...
動態分配陣列C 模板
通過動態分配的方法實現了動態陣列的建立,其中包括多種運算子過載。include define size 100 using namespace std template class array 有參建構函式,引數為陣列的長度 array int n length n 有參建構函式,引數為陣列的長度和...