HDOJ 1025-1030

Posted monster5475

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HDOJ 1025-1030相关的知识,希望对你有一定的参考价值。


 

1026
很典型的小狗迷宫问题,很自然的想到用回溯算法,虽然我写出来了 但是hdoj过不了。是否可以思考用栈的形式来实现呢,还有一个问题是还可以用剪枝算法 剪掉一些不必要的路径。。这个我还在思考过程中。我代码的注释写的挺完整,虽然有点复杂。。



1027
我用的办法是一种土办法,当时直接感觉就是确定这个序列的前k个数那么剩下来的就是(n-k)!种方法,只要求得M<(n-k)!即可,然后再去确定M是在第几个(n-k-1)!中,依次类推直到全部确认完毕。但是一直ac不过。后来去百度了一下原来这种叫做字典序,有一个算法专门算这种的。。 网上也有用全排列解这道题的人,其原理应该是全排列的产生方法如果是交换的刚好是字典序的顺序。但是没过。。



1028
一开始想法是用类似递归,但发现找不出答案,后来网上看了相应知识,发现这道题目可以用动态规划来做,还有就是可以用母函数来思考,动态规划的话动态转移方程为f(n,m) 把整数 n 拆成最多 m 个数字
当n<m时 在这道题目中n>m 所以f(n,m) = f(n,n);
当n==m时,两种情况,一种包含m,那么就是直接一种情况,1,另一种是不包含m,所以最大的数变成m-1,故f(n,m)=f(n,m-1);
当n>m时,那么有两种方式:一种是包含m,那么f(n,m) = f(n-m,m) ,另一种情况时不包括,这种情况下f(n,m) = f(n,m-1)。
if(n<m) f(n,m) = f(n,n);
else if(n==m) f(n,m) = f(n,m-1)+1;
else if(n>m) f(n,m) = f(n-m,m) + f(n,m-1);
以上是动态规划思想
接下来是母函数的想法,用1可以组成任意的数,我们用x^n表示n个1,故n个1能表示的数集合为(1+x^1+x^2+...+x^n),同理n个2有(1+x^2+x^4+...+x^n),n个3有(1+x^3+x^6+...+x^n)。所以将这些式子做乘法运算,当n接近于无穷大,可以得到任意一个数。(1+x^1+x^2+...+x^n)(1+x^2+x^4+...+x^n)(1+x^3+x^6+...+x^n)...(1+x^n)。我们称这种函数为生成函数(1+x^1+x^2+...+x^n)。
再举一个比较简单的母函数的例子 假设有一个 1d 2d 3d 4d的硬币。问能买哪些范围的东西,注意题设是每一种硬币只有一个。
那么我们可以得到这么一个母函数,对于1d来说(1+x^1),2d (1+x^2), nd (1+x^n)
因此这个题目的解析为(1+x^1)(1+x^2)(1+x^3)(1+x^4) 得到的最高项系数为我们可以购买的最高的物品。(1可以看成X^0)
这道题目可以有很多种变形 ,比如 限制硬币的个数不再是一个, 而是number[i]
再者 比如这不是硬币,而是一个物品,物品的价值为value[i] 重量为w[i] 个数为number[i] 那么求重量为v的背包 最大价值。。那么就变成了背包问题,那么怎么解决了。 可以明显看到 x^n前面的系数都为1,假设我们设其为t ,定义*为系数t的相加,那么我们最后得到的最终多项式前面的系数是否为所选物品的t(重量/价值)之和呢??思考。。


 

1029
这道题目找出所给数字中的主元素,就是说给出n个数,找出出现次数为(n+1)/2的那个数。这道题如果没有时间和空间的限制,要做还是蛮简单的,但如果要求空间复杂度为O(1),时间复杂度为O(n)。那就需要思考。。。。

从主元素的定义开始入手,假设给出的数中存在主元素x 那么也就是说存在(n+1)/2个x,剩下的数我们不管。那么我现在从这个数组合中拿出两个不同的数,有两种可能
1、拿出的数有一个为x , 那么这时候原来的数变成了 n-2,x的个数变成了(n+1)/2-1。这时候可以发现x还是原来的主元素。所以我们可以一直重复如此的操作直到最后,奇数情况下,如果存在最后一个数就是原来的数组的主函数,但如果不存在最后一个数可能是A,B,C,D任意的数,因此还要扫描一遍原来的数组判断最后一个数的个数是否超过half,超过为主元素否则不是,如果是偶数个数,那么剩下两个的话,那么这两个数肯定是一样的,且为主元素,要不就不存在主元素了。
2、拿出的数不含有x,那么这个情况下x还是原来的主元素,而且更加“主”了。



1030
真的是。真的是。大水题,江湖魔术,戳破就不值钱了。 我一开始想的好复杂,是不是dp 是不是!!!然后发现好像有方便的解法,考虑正三角和倒三角,从顶点到三角的两个角需要走两步,到下面那个值要一步,然后一直想怎么把两个点用这种方式连接起来,觉得自己好像走在正确的道路上~~~然后自己爆炸了。。
后来网上一看,我马上就惊醒了。原来只要标成三个坐标就可以。。。 (在我的代码中)z 表示水平坐标,y表示从左上到右下这种长条的坐标 也就是说 1 3 4 8 9 15 16的y坐标都是1,同理x是从右上到左下。
然后你会发现 wocao ,刚好行走的路线 不就是一个坐标轴一个一个的走吗!!!所以只要求出对应(x,y,z) 做一个差的和就可以。 这道题目巧妙的重新定义了曼哈顿距离 也就是我们传统意义上的两点间的距离,值得思考。


技术分享图片

放张图,坚持 刚好放下一个屏幕!


























以上是关于HDOJ 1025-1030的主要内容,如果未能解决你的问题,请参考以下文章

HDOJ-2037

HDOJ-2048

HDOJ-2047

HDOJ-1263

单调队列(双端队列) poj2823 hdoj3415 hdoj3530

ACM--数学--HDOJ 2086--A1 = ?