摘要: 有两种算法复杂度为 O(n*logn) 和 O(n^2)O(n^2)算法分析如下: (a[1]...a[n] 存的都是输入的数)1、对于a[n]来说.由于它是最后一个数,所以当从a[n]开始查找时,只存在长度为1的上升子序列;2、若从a[n-1]开始查找.则存在下面的两种可能性:(1)若a[n-1] < a[n] 则存在长度为2的上升子序列 a[n-1]、a[n];(2)若a[n-1] > a[n] 则存在长度为1的上升子序列 a[n-1]或者a[n];3、一般若从a[t]开始.此时最长上升子序列应该是按下列方法求出的:在a[t+1].a[t+2]… a[n]中.找出一个比a[t]大的且最长的 阅读全文
posted @ 2011-12-01 21:18 1050768624 阅读(252) 评论(0) 推荐(0) 编辑
摘要: 题目中穷国和富国在两条平行线上,而且修得路不能交叉,每个富国有且仅有某一个穷国所需要的资源。由此可将其转化为求在两平行线间最多可画多少条不交叉的直线问题,所以直接对某条线上的点求LIS,当n = 0时输出0条路。根据LIS模板AC的代码:View Code #include <stdio.h>#include <string.h>#define N 500001int i, n;int a[N], d[N];int binsearch(int x, int len){ int l = 1, r = len, mid; while(l <= r) { mid = . 阅读全文
posted @ 2011-12-01 19:05 1050768624 阅读(157) 评论(0) 推荐(0) 编辑
摘要: //二维的不会做啊= = !题目大意:给定一个含有正数和负数的矩阵,求其子矩阵的和的最大值解题思路:本题百思不得其解,第一次想用枚举每行每列。但是肯定TLE。之后搜了答案才做出来,而确定列的范围可以用到最大窜的概念数据结构:a[108][108] b[108]//b数组用来存第i行~~第j行相对列元素之和=================================================================(2)从一维到二维 一维的情况很简单,如何把一维的情况转化为二维情况呢?例如,对于本题的测试数据:我们可以每次任选几行,压缩成一行,这样就转化为了一维情况。例如,我 阅读全文
posted @ 2011-11-29 10:25 1050768624 阅读(674) 评论(0) 推荐(1) 编辑
摘要: 原来做过的一道题,有敲了一遍,就是个丑数。两种思路:①最官方的解法:用dp思想如果一个数是Humble Number,那么它的2倍,3倍,5倍,7倍仍然是Humble Number定义a为第i个Humble Numbera[n]=min(2*a[i1],3*a[i2],5*a[i3],7*a[i4]), i1,i2,i3,i4在被选择后相互移动View Code #include <stdio.h>#define N 5843__int64 min(__int64 a, __int64 b){ return a < b ? a : b;}__int64 hnum[N];int 阅读全文
posted @ 2011-11-27 19:47 1050768624 阅读(226) 评论(0) 推荐(0) 编辑
摘要: 简单DP,状态转移公式:num[j].data = max{num[j].data, num[j].data+num[j-1].data},也就是保证加上前一个数不失自己的值减小。View Code #include <stdio.h>#define N 100010#define inf 9999999struct _num{ int data; int pre; int next;}num[N];int main(){ int i, j, k, n, m, max; scanf("%d", &n); for(i=1;i<=n;i++) { .. 阅读全文
posted @ 2011-11-27 19:16 1050768624 阅读(152) 评论(0) 推荐(0) 编辑
摘要: 前言本篇文章是我(dd_engi)正在进行中的一个雄心勃勃的写作计划的一部分,这个计划的内容是写作一份较为完善的NOIP难度的动态规划总结,名为《解动态规划题的基本思考方式》。现在你看到的是这个写作计划最先发布的一部分。背包问题是一个经典的动态规划模型。它既简单形象容易理解,又在某种程度上能够揭示动态规划的本质,故不少教材都把它作为动态规划部分的第一道例题,我也将它放在我的写作计划的第一部分。联系方式如果有任何意见和建议,特别是文章的错误和不足,或者希望为文章添加新的材料,可以通过http://kontactr.com/user/tianyi/这个网页联系我。P01: 01背包问题 这是最基本 阅读全文
posted @ 2011-11-26 10:55 1050768624 阅读(2232) 评论(0) 推荐(0) 编辑
摘要: 开始最原始的背包方法,不断的TLE,代码如下View Code #include <stdio.h>#include <string.h>#define N 120010int ans[N];bool sign[N];int main(){ int a[7], i, j, l, sum, num1, num2, k = 1, x; while(scanf("%d%d%d%d%d%d", &a[1], &a[2], &a[3], &a[4], &a[5], &a[6]) != EOF) { sum = 0 阅读全文
posted @ 2011-11-26 10:44 1050768624 阅读(474) 评论(0) 推荐(0) 编辑
摘要: //开始用DFS,不断超时啊( ⊙ o ⊙ )!//贪心+并查集,对所有边排序,然后枚举每一条边,每条边的两个点合并为一个集合,当出现通路时就结束//利用了并查集的思想,其实就是和kruskal里面的实现是一个样子,枚举加了贪心View Code #include <stdio.h>#include <stdlib.h>#define inf 9999999#define N 1001struct _ed{ int s; int e; int l;}ed[N];int f[210];int cmp(const void *a, const void *b){ retur 阅读全文
posted @ 2011-11-25 20:33 1050768624 阅读(249) 评论(0) 推荐(0) 编辑
摘要: 母函数,不解释……View Code #include <stdio.h>#define N 10001int c1[N], c2[N];int main(){ int n,i,j,k; while (scanf("%d", &n) != EOF ) { for (i=0;i<=n;i++) { c1[i]=0; c2[i]=0; } for (i=0;i<=n;i++) { c1[i]=1; } for (i=2;... 阅读全文
posted @ 2011-11-24 20:12 1050768624 阅读(194) 评论(0) 推荐(0) 编辑
摘要: 单存的快速幂取模,就是a^b%c的变形……, 让c=10就可以了原理:(a*b)%c = (a%c * b%c)%c;View Code #include<stdio.h>int main(){ __int64 a, b, t; while(scanf("%I64d%I64d", &a, &b) != EOF ) { t=1; while(b) { if(b%2==1) { t=t*a%10; } a=a*a%10; ... 阅读全文
posted @ 2011-11-24 20:10 1050768624 阅读(156) 评论(0) 推荐(0) 编辑