一道经典的最长子序列题,不过该题需要维护两个量,体重和速度,所以需要先对一个量进行排序,然后剩下的那个量就可以像处理最长子序列那样做了。 值得一提的是该题需要打印路径,最好的方法是用一个数组pre运用类似链表的结构,来记录路径。 这恰恰就是紫书上数据结构那章例题14中所用的记录最短路路径的方法 。 其中的巧妙和实现细节请读者细细品味。
针对这道题, 由于dp是利用之前计算的结果进行递推得到的,...
分类:
其他好文 时间:
2015-05-18 16:46:49
阅读次数:
122
题意:给出n根高度为1,2,3,---n的杆子,从左边能看到l根,右边能够看到r根,问有多少种可能看的紫书的思路 先假设已经安排好了高度为2---i的杆子,那么高度为1的杆子的放置方法有三种情况放在最左边:从左边看得见,右边看不见放在最右边:从右边看得见,左边看不见放在中间,有i-2个空位可以插,左...
分类:
其他好文 时间:
2015-05-18 16:33:53
阅读次数:
279
水题一发,具体证明见紫书上huffman的讲解
#include
using namespace std;
int main(){
int n,x;
while(~scanf("%d",&n)&&n){
priority_queue, greater > q;
for(int i=0;i<n;i++) {
scanf("%d...
分类:
其他好文 时间:
2015-05-17 12:21:33
阅读次数:
108
因为行和列是无关的,所以可以单独处理,将问题分解成两个,那么需要求的就是在这n个区间里任选一个数,且这个数不重复。 这很像之前紫书上将的区间问题,可以采取贪心的策略,将区间(a,b) 先按照b从小到大排,再按照a从小到大排,然后在区间中的还没有被选的数字里优先挑选较小的数字。
但是由于这样经过排序后原来的顺序已经打乱了,所以预先给每个区间分配一个id ,一个v保存选的值,然后再按照id还原顺序就...
分类:
其他好文 时间:
2015-05-14 22:11:12
阅读次数:
155
紫书上将这道题的方法成为“滑动窗口” ,它还应该有另一个名字叫——取尺法, 用两个首尾“指针”通过不断更新它们来逐步得到最优解,适合于解决连续序列的问题。
#include
using namespace std;
const int maxn = 1000000+5;
int T,n,A[maxn];
int main(){
scanf("%d",&T);
while(T--)...
分类:
其他好文 时间:
2015-05-14 22:09:04
阅读次数:
344
紫书上叫中途相遇法,还有一个名字感觉更加妥帖一点,叫:折半枚举。 有时候,当问题的规模较大时,无法枚举所有元素的组合,但能够枚举一半的元素组合,此时,将问题拆成两半后分别枚举,再合并他们的结果这一方法往往非常有效。
两重循环加二分,总复杂度为n^2logn
这里值得一提的是对集合CD的存储方式,我是用了一个有序数组,也可以用其他方式。
#include
using nam...
分类:
其他好文 时间:
2015-05-13 21:56:06
阅读次数:
138
这道题的udebug里有测试数据,但是数据的答案貌似是错的。。真坑啊,还好我坚定的提交了~~
思路紫书上已经说的很清楚了,从后向前扫描数组(从下向上) 从最大的煎饼开始处理,如果第i 大的煎饼不在它应该在的位置,就对这个煎饼进行处理,先翻到最顶上,再翻到它应该在的位置。
#include
using namespace std;
int n,a[100],b[100];
string s,bu...
分类:
其他好文 时间:
2015-05-13 19:49:53
阅读次数:
131
这道题紫书上给出了一个很有趣的方法,按照这种规则排出的大楼一定能够满足任意两个不同的国家有一对相邻的格子(要么是同层中有公共边的格子,要么是相邻层的同一个格子) 至于证明我实在证明不了,只能确定它一定是成立的,读者不妨尝试着打印出来看看
#include
using namespace std;
int n;
int a[100] = {65,66,67,68,69,70,71,72,73,74...
分类:
其他好文 时间:
2015-05-13 19:45:16
阅读次数:
99
9-1 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3466书上是递推的,我写了个记忆化搜索dp有3种决策,左边的车,右边的车,原地不动, 1 #incl...
分类:
编程语言 时间:
2015-05-11 19:58:45
阅读次数:
148
UVA 580 枚举出现连续3个U第一次出现的位置。同时需要记录前i位不出现连续3个u的方案。
#include
#include
#include
#include
using namespace std;
typedef long long ll;
const int maxn = 20 + 10;
ll f[maxn],g[maxn];
ll quick(ll a,int n)...
分类:
其他好文 时间:
2015-05-08 22:01:09
阅读次数:
167