自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(15)
  • 收藏
  • 关注

原创 ACM第三次练习—1007

题意:天上掉馅饼,思路:跟之前做过的数塔题的思路有些类似,不过这是矩阵,可以这样想:建一个很大的矩阵A,那么A[i][j]表示第i秒第j位置有多少个馅饼,那么我把所有馅饼都填入表(矩阵中),这样我只要从底往上走,走到最上面一层,找到所走过的位置中馅饼之数最大的那个就是我们所求结果,这完全和数塔一样的思维。既然用到了动态规划,那么就必须思考动态规划的3个要素,其中子结构之间存在关系,并且那个递推

2016-05-29 11:18:39 487

原创 ACM第三次练习—1017

题意:一个人收集骨头。给出他的背包容量和可选的骨头的体积和价值,输出他的背包能装下的骨头的最大价值。思路:01背包问题,DP公式都类似:F[i;v] = maxfF[i-1;v];F[i-1;v-Ci] + Wi,由这个公式做变形就可以。下面再来分析一下这个公式:每种骨头仅有一件,可以选择放或不放。用子问题定义状态:即F[i;v] 表示前i 件物品恰放入一个容量为v的背包可以获得的最大价值

2016-05-22 10:57:00 358

原创 ACM第三次练习—1016

题意:在一无限大的二维平面中,我们做如下假设:1、每次只能移动一格;2、不能向后走(假设你的目的地是“向上”,那么你可以向左走,可以向右走,也可以向上走,但是不可以向下走);3、走过的格子立即塌陷无法再走第二次;求走n步不同的方案数(2种走法只要有一步不一样,即被认为是不同的方案)。思路:f[n]表示走n步的方案数,x[n]表示向下走的方案数,z[n]表示向左右

2016-05-16 22:29:45 364

原创 ACM第三次练习—1014

题意:我们看到过很多直线分割平面的题目,今天的这个题目稍微有些变化,我们要求的是n条折线分割平面的最大数目。比如,一条折线可以将平面分成两部分,两条折线最多可以将平面分成7部分,具体如下所示。思路:  先看N条相交的直线最多能把平面分割成多少块当添加第N条只显示,为了使平面最多, 则第N条直线要与前面的N-1条直线都相交,且没有任何三条直线教育一个点。则第N条直线有N-1个交点。由于每

2016-05-15 22:31:35 432

原创 ACM第三次练习—1013

题意:有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。编程实现在第n年的时候,共有多少头母牛?思路:依然是列举出了前几种情况,然后很快就找到了DP公式:f(n)=f(n-1)+f(n-3)。感想:这几个题都类似的~代码:#include #includeusing namespace std;int main(){   

2016-05-12 22:10:01 364

原创 ACM第三次练习—1012

题意:在2×n的一个长方形方格中,用一个1× 2的骨牌铺满方格,输入n ,输出铺放方案的总数.思路:假设用arr[i]表示2*i的方格一共有组成的方法数,我们知道arr[1]=1;arr[2]=2; 现在假设我们已经知道了arr[i-1]和arr[i-2],求arr[i],所谓arr[i],不过是在2*(i-1)的格子后边加上一格2*1的方格罢了,骨牌在这一格上横着放,竖着放,如果前面i-1块

2016-05-11 19:03:15 380

原创 ACM第三次练习—1015

题意;输入一个十进制数,把它转化成二进制数并输出。思路:很简单用数组来实现就可以,利用除2取余法。感想:会进制转化,想到用数组来存数就能解决。代码:#includeusing namespace std;int main(){ int n; int b[11]; while (cin >> n) { if (n == 0)

2016-05-09 18:49:14 382

原创 ACM第三次练习—1011

题意:有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行。请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数。思路:题目中没有图,去百度了下,然后简单的写了下前几个数之间可能对应的路线数就找到了DP公式:a[i]=a[i-1]+a[i-2];感想:有时候找到DP公式后题就很简单了。代码:#include #include int main() {    int 

2016-05-08 22:05:41 387

原创 ACM第三次练习—1010

题意:有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?思路:搜索题的感觉,前面几个数为1,1,2,3,第五个可以这样考虑:有些走法是和到第四个一样的,只是最后加了一步,这样f(5)=f(4)+x,x表示其他的走法,到第五级时不是走两步就是一步,一步刚才已经考虑过了,就是f(4),而最后是走两步的是在第三级开始的,到第三级的走法为f(3),所以f(5)

2016-05-07 22:20:53 322

原创 ACM第三次练习—1006

题意:如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?思路:此题采用动态规划从自顶向下计算,如果我们要知道所走之和最大,那么最后一步肯定是走最后排数其中一个,向上退,倒数第二步肯定走最后排数对应的倒数第二排最大的一个(将最后对应最后步走的最大的数加起来存在倒数第二步的数组中:不理解的话先看思路在看程序),再向上推,一直推到最上面的第0步,那么a

2016-05-06 22:34:07 762

原创 ACM第三次练习—1005

题意:把给定的长方体(不限)叠加在一起,叠加的条件是,上面一个长方体的长和宽都比下面长方体的长和宽短;求这些长方体能叠加的最高的高度。思路:每块积木最多有3 个不同的底面和高度,我们可以把每块积木看成三个不同的积木,那么n种类型的积木就转化为3*n个不同的积木,对这3* n个积木的长按照从大到小排序;然后找到一个递减的子序列,使得子序列的高度和最大。感想:最大完了就最小~代码:

2016-05-05 22:22:55 344

原创 ACM第三次练习—1004

题意:求丑数,就是因子只含2,3,5,7.若一个数n是丑数,则必定有n=2^a*3^b*5^c*7^d,因此只需求出所有的丑数,对其进行排序即可。思路:每个数都可以分解成有限个2 3 5 7 的乘积,dp方程为 dp[i]=f[i]=min(f[a]*2,min(f[b]*3,min(f[c]*5,f[d]*7)))找到比f[i-1]大且最小的数用到下面的方法:    a表示f[]

2016-05-05 08:54:48 410

原创 ACM第三次练习—1003

题意:求最大递增子段和。思路:类似最长递增子序列的想法,只不过这里求的是到第i个元素时,最长递增子序列,各个元素的和。求最大的那个值。感想:这几个都类似的。代码:#include  #include  #include  using namespace std;    int a[1005],dp[1005];  const int inf = 999

2016-05-03 22:33:16 375

原创 ACM第三次练习—1002

题意:求两个字符串的最长公共子序列。思路:动态的方程在第一个元素的相等的时,dp[0][0] = dp[-1][-1] + 1, 天哪,这肯定就会出错了。在处理时可以选择字符的读取从第一个位置开始,或者把 i 号字符的状态存储到i+1号位置去,这样就从1号开始处理了,判定是就是 s1[i-1] == s1[j-1] ?感想:弄了很久,熟练这个词太难~代码:#include

2016-05-02 20:39:55 442

原创 ACM第三次练习—1001

题意:给出序列a [1], a [2], a [3] ...... a [n],计算子序列的最大总和。思路:最大子序列是要找出由数组成的一维数组中和最大的连续子序列。方法是:只要前i项和还没有小于0子序列就一直往后扩展,否则丢弃之前的子序列开始新的子序列,同时记录各个子序列的和,最后取他们中的最大值。感想:第一道动态规划题,感觉要考虑的东西很多,脑子有些不都用了~代码: #

2016-05-01 11:35:57 345

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除