摘要: 题目描述: 一节课有n分钟,ZZZ每听一分钟课都能得到一定的分数,一旦她开始听课就必须要至少连续听l分钟,但是她每节课都要有m分钟的睡眠时间(这m分钟不连续),问在不影响她睡觉的情况下, 她一节课最多能得多少分。。。题面建模: dp。首先dp[i][j]表示前i分钟有j分钟是睡觉时间, 如果第i分钟睡觉dp[i][j]=dp[i-1][j-1];第i分钟学习的话: dp[i][j]=max(dp[k][j]+score[i]-score[k]) (1<=k<=i-l)。 score[i]表示前i分钟的分数之和。解题要点: 注意边界的处理和dp数组的初始化,开始的时候应将dp[i][ 阅读全文
posted @ 2012-04-21 10:59 LETTers 阅读(126) 评论(0) 推荐(0) 编辑
摘要: 题目描述: 给出n个数,从中找出k对数使得每对数差的平方之和最小。题面建模: dp。 设定dp[i][j]存储的值为当选择到第i个数时,已选出j对数的最小差的平方。 那么有转移方程dp[i][j]=Min(dp[i-1][j],dp[i-2][j-1]+(object[i]-object[i-1])*(object[i]-object[i-1])) 这样最后的答案为dp[n][k]。解题要点: 注意边界的处理和dp数组的初始化,开始的时候应将dp[i][j]=INF。时空开销分析: 空间复杂度:O(n)。时间复杂度:O(n^2)。特别说明: 无。程序:#include <stdio.h& 阅读全文
posted @ 2012-04-21 10:23 LETTers 阅读(144) 评论(0) 推荐(0) 编辑
摘要: 题目描述: 有一个爱收集骨头(不良癖好)的家伙,他有一个背包,容积是V。现在有n块骨头,每块骨头有两个属性:体积volume和价值value。问他能够收集的骨头的价值之和最大是多少。题面建模: 简单背包问题。 背包已用容积是j时,dp[j]=max(dp[j],dp[j-volumek]+valuek)。 转移方程:dp[j]=dp[j]>dp[j-bone[i][1]]+bone[i][0]?dp[j]:dp[j-bone[i][1]]+bone[i][0];解题要点: 注意边界的处理。时空开销分析: 空间复杂度:O(n)。时间复杂度:O(n^2)。特别说明: 无。程序:#includ 阅读全文
posted @ 2012-04-21 09:56 LETTers 阅读(200) 评论(0) 推荐(0) 编辑
摘要: 题目描述: 本题题意就是给出一个n*m矩阵,然后求一个x*y的子矩阵,并且此子矩阵元素和最大。题面建模: 简单模拟。 思路还是很简单的,我们设计一个sum[n][m],其中sum[i][j]表示以(1,1)为左上顶点,以(i,j)为右下顶点的矩阵的所有元素和。这样我们要求以(i,j)为右下顶点大小为x*y的子矩阵所有元素和就有以下公式:ans=sum[i][j]-sum[i-x][j]-sum[i][j-y]+sum[i-x][j-y]遍历所有这样的子矩阵就可以求出答案。解题要点: 注意边界的处理。时空开销分析: 空间复杂度:O(n^2)。时间复杂度:O(n^2)。特别说明:无。程序:#inc 阅读全文
posted @ 2012-04-21 09:33 LETTers 阅读(220) 评论(0) 推荐(0) 编辑
摘要: Last non-zero Digit in N!该题数据较大,n可能有数百位,直接计算n!或通过n次计算都必然会超时。关键在于找出数字的规律。对于n<10,直接枚举即可,下面考虑n>=10的情况。n!的尾部的0都来自因子5和因子2(一对5&2产生一个0),如果把这些因子去掉,则可符合要求。定义F(n)为所要求的数,G(n)为1,2…n中将5的倍数的数换成1后的各项乘积(如:G(15)=1*2*3*4*1*6*7*8*9*1*11*12*13*14*1)(G(n)%10必不为0)。则n!=(n/5)!*5^(n/5)*G(n),F(n)=F(n/5)*[5^(n/5)*G( 阅读全文
posted @ 2012-04-18 22:32 LETTers 阅读(421) 评论(0) 推荐(0) 编辑
摘要: N!的最高位该题如果直接用上述方法必然会超时,因为只要最高位,精确的方法可以是x=(int)(10^( log10(N!)-(int)log10(N!))),但由于n可能很大,这样都会超时,这里用到一个公式,Stirling公式,在n较小时直接给出,在较大时用Sterling公式算出n!近似值,再求的最高位。#include<iostream>#include<math.h>using namespace std;const double PI = 3.14159265358979323846;const double E = 2.7182818284590452353 阅读全文
posted @ 2012-04-18 22:23 LETTers 阅读(242) 评论(0) 推荐(0) 编辑
摘要: N!log10(10000!) = ∑log10(i)( 1<= i <= 10000) = 35659.5,所以10000!≈10^35659.5,这个数很大,所以用模拟手算乘法的方法计算。#include<iostream>#include<math.h>using namespace std;#define MAXN 40000int a[MAXN], bit;void mul(int*m, int a) // m = m * a{ int c, i; bit += int(log10(double(a))) + 2; for(c=0,i=0; i&l 阅读全文
posted @ 2012-04-18 21:33 LETTers 阅读(137) 评论(0) 推荐(0) 编辑
摘要: 报告人:侯建鹏报告日期:2012/4/161004 Max Sum Plus Plus解题思路:动态规划的思想。1.基本思路:首先,定义数组p[n],a[m][n].p[n]用来存储n个整数组成的序列.a[i][j]用来表示由前j项得到的含i个字段的最大值,且最后一个字段以p[j]项结尾。仔细想想,我们可以知道: a[i][j]=max(a[i][j-1]+p[j],a(i-1,t)+p[j]) 其中i-1<=t<=j-1.所求的最后结果为 max( a[m][j] ) 其中1<=j<=n.但是,我们会发现,当n非常大时,这个算法的时间复杂度和空间复杂度是非常高的,时间 阅读全文
posted @ 2012-04-16 21:43 LETTers 阅读(173) 评论(0) 推荐(0) 编辑
摘要: 报告人:侯建鹏报告日期:2012/4/161003 大明A+B解题思路:模拟我的方法很简单,就是不停的模拟、模拟、再模拟。首先,把每个数都分成两部分,整数部分和小数部分,即a_h_count、a_l_count、b_h_count、b_l_count。相信只要细心一些都可以做出来的。然后,把模拟人工计算过程,先加小数位,加完之后,产生的对整数位的进位再和两个数的整数部分相加,最后把零去掉,输出就可以了。关键是:一定要细心!!!详见代码。#include<stdio.h>#include<string.h>#define N 400+10char a[N],b[N];in 阅读全文
posted @ 2012-04-16 21:41 LETTers 阅读(350) 评论(0) 推荐(0) 编辑
摘要: 提交人:侯建鹏提交日期:2012/4/161002 Ignatius and the Princess III解题思路(一):动态规划先设置int p[N][N];Dp 方程为:p[i][j]=p[i][j-1]+p[i-j][j]。其中,p[i][j]表示将i分解成小于等于j个项的方法的种数。很明显,p[i][j]等于将i分解成小于等于j-1个项的种数(即p[i][j-1]),再加上,将它分解成j个项的方法的种数(即p[i-j][j]).下面重点来说一下为什么将i分解成j个项的方法的种数为p[i-j][j]。举例:将4分解成2个项的方法有两种,3、1和2、2.将这两组数字每个数字都减一,你会 阅读全文
posted @ 2012-04-16 21:38 LETTers 阅读(329) 评论(0) 推荐(0) 编辑