題意:給出N,M,問有多少個長度爲N的整數序列,知足全部數都在[1,M]內,而且每個數至少是前一個數的兩倍。例如給出N=4, M=10, 則有4個長度爲4的整數序列知足條件: [1, 2, 4, 8], [1, 2, 4, 9], [1, 2, 4, 10], [1, 2, 5, 10]c++
分析:可用動態規劃解題,假設dp[i][j],表明知足以整數i爲尾數,長度爲j的序列的個數(其中每個數至少是前一個數的兩倍)。那麼對於整數i,dp[i][j] 等於全部dp[k][j-1]的和,其中k知足:2*k <= i。計算出dp矩陣後,答案即是dp[i][N]的和(i = 1, 2, ... ,N)spa
#include <bits/stdc++.h> using namespace std; int main(int argc, char const *argv[]) { int T; int index = 0; cin >> T; while(T--){ int N, M; cin >> N >> M; long long dp[M+1][N+1]; memset(dp, 0, sizeof(dp)); for(int i = 1; i <= M; i++){ for(int j = 1; j <= N; j++){ if(j == 1)dp[i][j] = 1; else{ for(int k = 1; 2*k <= i; k++){ dp[i][j] += dp[k][j-1]; } } } } long long ans = 0; for(int i = 1; i <= M; i++){ ans += dp[i][N]; } printf("Case %d: n = %d, m = %d, # lists = %lld\n", ++index, N, M, ans); } return 0; }