`
rapheal
  • 浏览: 171061 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

【动态规划】sicily1011

阅读更多

1011. Lenny's Lucky Lotto

题目大意:

给定正整数n, m,构建的列表满足下列条件:

  1. 列表长度为n
  2. 列表的第i个数不能超过2的i次方
  3. 列表的最后一个数不能超过m

求出这样的列表的最大数目。

 

解题思路:

  1. 一般遇到需要求最优解的,应该立马想到动态规划;
  2. 影响列表的数目的应该是有两个状态,一个是列表的长度,一个是列表的末尾值。因此采用两个状态,申请表dp[11][2001]。其中dp[i][j]表示:当长度为i,末尾为j的列表的数目。
  3. 状态转移方程:
dp[i][j] = dp[i][j-1] + dp[i-1][j/2]

很容易理解这个状态方程。

 

初始化状态当然是dp[1][i] = i,加上一些必要的剪支,列表的第i个数一定是大于2的i次方并且要小于(m / 2^(n-i))的,自己可以证明。

一开始疏忽了,没有使用long long类型,WA几次之后发现数字过大时,可能出现负数,使用printf打印long long时是采用%lld的格式。

 

原题目见底下附带。

代码如下:

 

/*
 * main.cpp
 *
 *  Created on: Sep 23, 2011
 *      Author: raphealguo( rapheal.iteye.com)
 */

#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;

#define N 11
#define M 2001
long long dp[N][M];//dp[i][j] 表示n=i m=j时的最大Luck list数目
int n, m;

void solve(){
	//动态规划
	int i, j;

	for (i = 1; i <= m; ++i){//初始化
		dp[1][i] = i;
	}
	for (i = 2; i <= n; ++i){
		for (j = 1<<(i-1); j*(1<<(n-i)) <= m; ++j){//必要作出一些剪支,减少运算
			dp[i][j] = dp[i][j-1] + dp[i-1][j/2];
		}
	}
}

int main(){
	int t, c = 1;
	scanf ("%d", &t);

	while (t--){
		memset(dp, 0, sizeof(dp));
		scanf ("%d %d", &n, &m);

		solve();

		printf("Case %d: n = %d, m = %d, # lists = %lld\n", c++, n, m, dp[n][m]);
	}

	return 0;
}

 

 

附带原题目:

1011. Lenny's Lucky Lotto

Description

Lenny likes to play the game of lotto. In the lotto game, he picks a list of  N   unique numbers in the range from  1   to  M . If his list matches the list of numbers that are drawn, he wins the big prize.

 

Lenny has a scheme that he thinks is likely to be lucky. He likes to choose his list so that each number in it is at least twice as large as the one before it. So, for example, if  = 4   and = 10 , then the possible lucky lists Lenny could like are:

 

1 2 4 8

1 2 4 9

1 2 4 10

1 2 5 10

 Thus Lenny has four lists from which to choose.

Your job, given  N   and  M , is to determine from how many lucky lists Lenny can choose.

Input

There will be multiple cases to consider from input. The first input will be a number C (0 < C <= 50) indicating how many cases with which you will deal. Following this number will be pairs of integers giving values for N and M, in that order. You are guaranteed that 1 <= N <= 10, 1 <= M <= 2000, and N <= M. Each N M pair will occur on a line of its own. N and M will be separated by a single space.

Output

For each case display a line containing the case number (starting with 1 and increasing sequentially), the input values for N and M, and the number of lucky lists meeting Lenny’s requirements. The desired format is illustrated in the sample shown below.

Sample Input

3
4 10
2 20
2 200

Sample Output

Case 1: n = 4, m = 10, # lists = 4
Case 2: n = 2, m = 20, # lists = 100
Case 3: n = 2, m = 200, # lists = 10000
分享到:
评论

相关推荐

    sicily部分题目源代码

    在 sicily 上的题目,通常会涉及到排序、搜索、图论、动态规划、贪心算法、回溯算法等经典算法。每种算法都有其特定的应用场景和优缺点,理解并掌握它们是成为一名优秀程序员的关键。 1. **排序算法**:如快速排序...

    sicily AC代码

    5. **Poor contestant Prob**:题目名称暗示可能是一个概率问题,需要理解概率理论和随机过程,可能涉及到动态规划或蒙特卡洛模拟来求解。 6. **MJ, Nowhere to Hide**:可能是一个搜索或图遍历问题,比如深度优先...

    soj.rar_1876_sicily 1022_sicily 1934_sicily soj IP

    这些题目可能涵盖了不同的难度等级和数据结构应用,如排序、搜索、图论、动态规划等。 标签 "1876 sicily_1022 sicily_1934 sicily_soj_ip" 进一步强调了问题的编号和主题。这里 "IP" 可能指的是 "Interactive ...

    CPP-for-sicily.zip_sicily

    算法方面,排序(如冒泡排序、快速排序、归并排序)和查找(如二分查找、哈希查找)是基础,而动态规划、贪心算法、回溯法等更高级的策略则常常出现在复杂的竞赛题目中。 "C++ for sicily.doc"文档可能涵盖了这些...

    sicily-1274.rar_sicily

    2. **算法和数据结构**:查找并学习使用的算法和数据结构,如排序、搜索、图论、动态规划等。 3. **编程语言特性**:根据源代码的语言,学习和熟悉特定语言的语法和最佳实践。 4. **设计模式**:识别和理解代码中...

    sicily刷题指南

    中大sicily online judge的刷题指南,里面介绍得很详细,不过,最近sicily好像不能外网访问了。

    sicily-code--2.rar_sicily

    3. **算法与数据结构**:参考代码中很可能包含了各种算法实现,如排序、搜索、图论、动态规划等。数据结构如数组、链表、树、图、哈希表等也可能是重点。理解这些算法和数据结构的原理及其应用是提升编程能力的关键...

    sicily 1562.LVM

    sicily 1562_LVM.cpp参考代码

    Sicily_Queue.rar_sicily

    "Sicily_Queue.rar_sicily"这个压缩包文件显然包含了与在Sicily平台上实现高效队列操作相关的代码或文档。 首先,我们需要理解队列的基本概念。队列就像一个等待服务的队伍,新进来的元素(入队)会排在队伍的末尾...

    sicily1006代码

    本cpp是sicily的1006的解题代码 这份代码以最简单的方式实现了它的功能要求 值得学习一番

    sicily1294.rar_1294_sicily

    【标题】"sicily1294.rar_1294_sicily" 提供的信息表明,这可能是一个与中山大学ACM竞赛相关的代码压缩包,其中包含了对问题1294 "Sicily"的解决方案。在ACM(国际大学生程序设计竞赛,International Collegiate ...

    sicily上部分题目代码

    在 sicily 平台上,题目涉及的编程语言可能包括但不限于 Python、Java、C++、JavaScript 等,而解题思路可能涉及到排序算法(如冒泡排序、快速排序)、搜索算法(如二分查找、深度优先搜索)、动态规划、图论、字符...

    sicily1007题

    sicily1007题答案,附代码解释,可以在平台上通过

    sicily题目1093 1888

    对于题目1093和1888,它们的具体内容和要求是未知的,可能涉及到排序、搜索、图论、动态规划、字符串操作等各种算法和问题领域。要完全理解这些代码,我们需要查看题目描述,这通常会提供输入格式、输出要求、示例...

    sicily-code.rar_1137_sicily

    3. **数据结构与算法**:作为学术项目,可能涉及到复杂的数据结构(如链表、树、图)和算法(排序、搜索、动态规划等),这些都是计算机科学的基础。 4. **软件工程**:项目可能遵循软件工程的原则,包括需求分析、...

    sicily-code--3.rar_sicily

    【标题】"sicily-code--3.rar_sicily" 提供的是中山大学sicily课程相关的编程参考资料,这可能是一门涵盖计算机科学与信息技术的课程,其中涉及到的代码可能是用于教学或者项目实践。从描述来看,这个压缩包包含了...

    sicily_source.zip_sicily

    在“sicily_source.zip_sicily”这个压缩包文件中,我们主要关注的是与西西里相关的编程练习,这些练习涵盖了输入输出操作和标准程序设计,同时也涉及到超高精度浮点数的输出问题以及关联数组这一数据结构。...

    sicily-online-judge.zip_sicily

    - "robot.cpp" 文件的名称没有明确指明具体主题,但考虑到 sicily online judge 的背景,这可能是一个关于机器人路径规划或运动控制的编程问题,可能涉及到搜索算法(如深度优先搜索或广度优先搜索)或图论中的移动...

Global site tag (gtag.js) - Google Analytics