牛客網暑期ACM多校訓練營(第二場) A
阿新 • • 發佈:2019-02-08
run
題解:
簡單的動態規劃。
題目提到 White Cloud 有兩種移動方式① walk 1 meters per second,② run k meters per second。
也就是說從次末狀態到末狀態有兩種方式即 “walk 1 meters” 和 “run k meters” 。
也就是說,我們只需要把倒退 1 meter 和 k meters 的兩種狀態求出來就求出末狀態。
從上面我們可以想到 “dp[i] = dp[i-1] + dp[i-k];” ,但是要注意,題目還有一個條件 Since White Cloud is tired,it can't run for two or more continuous seconds ,即White Cloud 不能連續奔跑。所以,我們要寫成 “dp[i] = dp[i-1] + dp[i-k-1];” 。
還有要注意的是,因為 Init 函式裡 %mod 可能導致 dp[r] < dp[l-1] ,所以 dp[r] + mod 以確保 > dp[l-1]。
程式碼:
#include <cstdio> using namespace std; const int MAXN = 1e5+10; const int mod = 1e9+7; int k, q, l, r; int dp[MAXN]; void Init(){ for(int i = 0; i < k; i++) dp[i] = 1; dp[k] = 2; for(int i = k+1; i <= 100000; i++) dp[i] = (dp[i-1] + dp[i-k-1]) % mod; for(int i = 1; i <= 100000; i++) dp[i] = (dp[i] + dp[i-1]) % mod; return ; } int main(){ scanf("%d %d", &q, &k); Init(); while(q--){ scanf("%d %d", &l, &r); printf("%d\n", (dp[r] - dp[l-1] + mod)%mod); } return 0; }