上一页 1 ··· 51 52 53 54 55 56 57 58 59 ··· 85 下一页
  2011年12月16日
摘要: UVA_10157 我们可以把最左边的“(”和其配对的“)”看成一组分界线,它们把剩余的括号分成了内外两部分,其中里面的部分深度最多为d-1,外面部分的深度最多为d。我们不妨设f[i][j]表示一共有i对括号时深度不超过j的表达式的数量,那么f[i][j]=sum{f[k][j-1]*f[i-k-1][j]},最后输出的结果即是f[n/2][d]-f[n/2][d-1],当然前提是n为偶数。import java.math.BigInteger;import java.util.Scanner;public class Main { public static void main(Str... 阅读全文
posted @ 2011-12-16 23:23 Staginner 阅读(701) 评论(0) 推荐(0) 编辑
摘要: UVA_10328 这个和之前做过的一个计算连续胜利场数为k场的概率的题目很像,所以就把那个题目用到的思想搬过来了。 我们设f[i][j]表示抛第i个硬币时连续的H不超过j个的情况总数,那么由于第i个可以为正可以为负,因此不妨先写成f[i][j]=2*f[i-1][j]。 但是这么写有些情况下是不正确的,什么情况呢?就是前面i-1个硬币的最后j个全是H,那么第i个如果再是H的话,总长度就变成j+1了。 在减去这部分的种数的时候,我们要分情况讨论一下。如果i==j+1,那么就只有一种情况可以出现j+1个H,就是i个硬币全部是H,因此减去1即可。如果i>j+1,那么如果第i个硬币前面有j个H 阅读全文
posted @ 2011-12-16 21:33 Staginner 阅读(1058) 评论(0) 推荐(0) 编辑
摘要: UVA_10254 如果我们设f[i]为4个柱子时把i个东东从一个柱子移到另一个柱子所用的最少步骤,设g[i]为3个柱子时对应的值,我们可以得到f[n]=min{2*f[k]+g[n-k]},其中g[i]是已知的为2^i-1。 然后接着就搞不下去了,看了别人报告说要找规律,o(╯□╰)o。有了上面的式子之后,我们打印前60个解还是很好打印的,同时把f[i]-f[i-1]也打印出来,这时会发现f[i]-f[i-1]都是2的某次方,而且2的k次方一共连续出现了k+1次,于是我们就可以以这个特征为依据预处理出所有解了。import java.math.BigInteger;import java.u 阅读全文
posted @ 2011-12-16 21:04 Staginner 阅读(427) 评论(0) 推荐(0) 编辑
摘要: UVA_10910 首先,如果总的分数不够的话,肯定输出0。之后我们就可以把问题转化成这样了,假设多出来的分数为p,那么把p个相同的小球放到N个盒子里,每个盒子可以为空,一共有多少种方法? 解决上面说的这种放小球的问题可以用“隔板法”,N-1隔板隔开的小球的情况就是相应每个盒子里小球的状况,由于盒子可以为空,就相当于p+N-1和空位选出N-1个位置放隔板的方法数,那么结果就是C(p+N-1,N-1),转换成原题的数据,就是C(T-P*N+N-1,N-1)。#include<stdio.h>#include<string.h>int N, T, P;void solve( 阅读全文
posted @ 2011-12-16 17:52 Staginner 阅读(358) 评论(0) 推荐(0) 编辑
摘要: UVA_11069 这个题目要求求出原图的最大独立点集的个数。 我们不妨考虑一下第1个点的选择与否来看看能不能得到一些递推关系。如果选第1个点的话,那么一定不能选第2个点,但是否一定选第3个点呢?不一定,因为也可以选第4个点。实际上第2个点后面只要是n-2个点的最大独立点集就可以,因为里面必然有一个3或者4。这样f(n)最起码有一部分的数值等于f(n-2)。 接下来考虑不选第1个点的情况,那么就必然要选第2个点,必然不选第3个点,第3个点以后的选择情况就和上面一样了,只要是n-3个点的最大独立点集就可以,这样我们就得到总的递推公式了,f(n)=f(n-2)+f(n-3)。#include< 阅读全文
posted @ 2011-12-16 17:02 Staginner 阅读(282) 评论(0) 推荐(0) 编辑
摘要: UVA_10236 这个题目AC得太辛苦了,也再一次加深了对浮点数误差的理解,库函数能不调还是最好别调……其实后来感觉就像UVA论坛上一个人说的,AC这个题有两个准则,第一个是要用long double,第二个是不要相信fmod、sqrt、pow等这些库函数,它们都会带来精度上的问题。 下面回到题目,这个题目涉及的知识还是满多的,又让我学到了不少。首先,我们要知道fibonacci素数的特征,fibonacci数列的第3、4项的2、3为fibonacci素数,第5项及其之后的素数项均为fibonacci素数,因此我们就要知道第22000个素数大概在什么范围。百度了之后发现10^6之内可以产.. 阅读全文
posted @ 2011-12-16 16:32 Staginner 阅读(524) 评论(0) 推荐(0) 编辑
摘要: UVA_10918 首先来讲,如果n为奇数,必然无解。 当n为偶数时,一个比较直观的思路就是把大矩形用竖线切出左边一部分,然后递归求解,就像UVA_10359那样,直接考虑最左边一个小矩形是如何构成的我们就可以递归得到f(n)递推式。 虽然这个题目乍看上去小矩形似乎拼法比较多,而且要拼出一个不能再用竖线切分的小矩形似乎拼的方法也并不直观。但如果我们在纸上多画一画的话,对于拼任意一个横向边长为x的不可再用竖线切分的小矩形,如果x为2,显然有3种拼法,如果x为大于2的偶数,那么只有2种拼法。 至于如果x>2为什么只有两种拼法,我们不妨实际拼一下。首先第一列肯定只有两种情况,第一种是一个横的在 阅读全文
posted @ 2011-12-16 12:47 Staginner 阅读(842) 评论(0) 推荐(0) 编辑
摘要: UVA_10519 第n个圆与n-1个圆共有2*(n-1)个交点,新生成2*(n-1)个区域,所以f(n)=f(n-1)+2*(n-1),进而可得f(n)=n^2-n+2,但要注意f(0)=1。import java.math.BigInteger;import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); BigInteger n; while(cin.has... 阅读全文
posted @ 2011-12-16 01:43 Staginner 阅读(313) 评论(0) 推荐(0) 编辑
  2011年12月15日
摘要: UVA_10359 我们令f(n)表示有n列时的放置种数,那么我们不妨考虑左边第一个位置如何放置。实际上一共有三种情况,这样就可以得到f(n)=f(n-1)+2*f(n-2)。import java.math.BigInteger;import java.util.Scanner;public class Main { public static void main(String[] args) { Scanner cin = new Scanner(System.in); BigInteger[] f = new BigInteger[260]; ... 阅读全文
posted @ 2011-12-15 22:40 Staginner 阅读(252) 评论(0) 推荐(0) 编辑
摘要: UVA_10940 列举出前有限项就会发现规律,f(1)=1,f(n)=f(2^m+k)=2*k,其中k<=2^m<n。#include<stdio.h>#include<string.h>#define MAXD 500010int f[MAXD], N;void prepare(){ int i, k; k = 1; f[1] = 1; for(i = 2; i <= 500000; i ++) { if(k * 2 < i) k *= 2; f[i] = 2 * (i - k); }}int main(... 阅读全文
posted @ 2011-12-15 22:23 Staginner 阅读(293) 评论(0) 推荐(0) 编辑
上一页 1 ··· 51 52 53 54 55 56 57 58 59 ··· 85 下一页