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
",cas++,n,m,ans);
32     }
33     return 0;
34 }
View Code
原文地址:https://www.cnblogs.com/luyingfeng/p/3659591.html