POJ 2193 Lenny's Lucky Lotto Lists (DP)

题目链接

题意 : 给你两个数N和M,让你从1到M中找N个数组成一个序列,这个序列需要满足的条件是后一个数要大于前一个数的两倍,问这样的序列有多少,输出。

思路 : dp[i][j]代表着长度为 i 的序列,最后一位是 j ,所以初始化的时候dp[1][ i ] = 1 ;dp[i][j] = sum(dp[i][k])(k < j/2) ;

 1 #include <stdio.h>

 2 #include <string.h>

 3 #include <iostream>

 4 

 5 using namespace std ;

 6 

 7 __int64 dp[11][2001];

 8 

 9 void chart()

10 {

11     memset(dp,0,sizeof(dp));

12     for(int i = 1 ; i <= 2000 ; i++)

13         dp[1][i] = 1 ;

14     for(int i = 2 ; i <= 10 ; i++)

15         for(int j = 1<<(i-1) ; j <= 2000 ; j++)

16             for(int k = 1 ; k <= j/2 ; k++)

17                 dp[i][j] += dp[i-1][k];

18 }

19 int main()

20 {

21     int t;

22     scanf("%d",&t);

23     int n,m ,cas = 1;

24     chart();

25     while(t--)

26     {

27         __int64 ans = 0 ;

28         scanf("%d%d",&n,&m);

29         for(int i = 1 ; i <= m ; i++)

30             ans += dp[n][i];

31         printf("Case %d: n = %d, m = %d, # lists = %I64d\n",cas++,n,m,ans);

32     }

33     return 0;

34 }
View Code

 

你可能感兴趣的:(list)