Sicily 1146:Lenny's Lucky Lotto(dp)

  題意:給出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;
}
相關文章
相關標籤/搜索