JZOJ3847 都市環遊 dp 矩陣乘法

2022-09-01 09:24:16 字數 1372 閱讀 2262

因為sjy幹的奇怪事情過多,sjy收到了休假的通知,於是他準備在都市間來回旅遊。sjy有一輛車子,一開始行駛效能為0,每過1時間行駛效能就會提公升1點。每個城市的道路都有效能要求。sjy一共有t時間休息,一開始他位於1號城市(保證1號城市道路要求為0),他希望在n號城市結束旅程。每次穿過一條城市間的路會花費1時間,當然他也可以停留在乙個城市不動而花費1時間。當且僅當車子的行駛效能大於等於乙個城市,我們才能到達那裡。sjy希望知道,旅遊的方案模10086後的答案。(只要在某一時刻通過的道路存在一條不相同,就算不同的方案)

如果沒有效能的要求,那麼這道題就是一道矩陣乘法的裸題。

但是有效能的要求,而矩陣乘法中是沒辦法判斷的。

觀察到這道題hi≤

70hi​

≤70,所以當t

>70t

>70

之後就不用再考慮效能的問題了。

所以我們可以用dpd

p推出前7070

個單位時間到達每乙個點的方案數,然後矩陣乘法t−70

t−70

次即可。

#include

#include

#include

using

namespace std;

const

int n=

110,mod=

10086

;int n,m,t,h[n]

,g[n]

[n];

struct matrix

f,a;

matrix operator

*(matrix a,matrix b)

void

power

(int k)

intmain()

for(

int i=

1;i<=n;i++

) a.a[i]

[i]=1;

g[1][

0]=1

;for

(int i=

1;i<=

70;i++

)for

(int j=

1;j<=n;j++)if

(h[j]

<=i)

if(t<=70)

return

!printf

("%d"

,g[n]

[t])

;for

(int i=

1;i<=n;i++

) f.a[1]

[i]=g[i][70

];power

(t-70);

printf

("%d"

,f.a[1]

[n])

;return0;

}

384,整數反轉

給出乙個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。示例 1 輸入 123 輸出 321 示例 2 輸入 123 輸出 321 示例 3 輸入 120 輸出 21 問題分析看到這道題可能我們最容易想到的是先把他轉化為乙個字串,然後再進行反轉,如下 public intrevers...

3 8 4 確定迴圈

for迴圈語句是支援迭代的一種通用結構,利用每次迭代之後更新的計數器或類似的變數來控制迭代次數。for int i 1 i 10 i for語句的第一部分通常用於對計數器初始化 第二部分給出每次新一輪迴圈執行前要檢測的迴圈條件 第三部分指示如何更新計數器。有一條不成文的規則 for語句的3個部分應該...

384,整數反轉

給出乙個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。示例 1 輸入 123 輸出 321 示例 2 輸入 123 輸出 321 示例 3 輸入 120 輸出 21 問題分析看到這道題可能我們最容易想到的是先把他轉化為乙個字串,然後再進行反轉,如下 public intrevers...