上一页 1 2 3 4 5 6 7 8 ··· 11 下一页
摘要: 简单贪心,贪心原则是将每一个单调序列尽可能的大。#include<iostream>#include<cstdio>#include<cstring>using namespace std;int data[100001];int work(int m,int n){ int head=m+1,count=0; if(n-m<=1) return 1; while(head<=n) { count++; while(data[head]==data[head-1]) head++; if(data[head]>data[head... 阅读全文
posted @ 2012-05-08 13:11 书山有路,学海无涯 阅读(185) 评论(0) 推荐(0) 编辑
摘要: 用动态规划超时了,悲剧,没想到可以用贪心O(n)就搞定了。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;struct node{ int x,y;}vert[100010];int res[100010];int cmp(node a,node b){ return a.x < b.x;}int work(int n,int m){ int i,k=0,max=0,count=0,pre=0; if(n==0 阅读全文
posted @ 2012-05-07 11:11 书山有路,学海无涯 阅读(165) 评论(0) 推荐(0) 编辑
摘要: 简单DP,状态转移方程如下:res[i][j]=min(res[i][j],res[k][j-1]+fact(k+1,i)) (1<=j<i && j<=m, 1<=i<=n, 1<=k<i);fact(i,j)表示从i到j的系数。#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define MAX 1234567890int res[501][501],fact[501][501],horse[501]; 阅读全文
posted @ 2012-05-06 11:54 书山有路,学海无涯 阅读(191) 评论(0) 推荐(0) 编辑
摘要: 令res[i][0]表示升级到i并且是正版的最小消费,res[i][1]表示升级到i并且是盗版的最小消费。res[i][0]=min(res[i][0],res[k][0]+edge(k,i)) (其中k必须可以升级到i,并且保证升级到i是正版);res[i][1]=min(res[i][1],res[k][x]+edge(k,i)) (其中res[k][x]表示正版盗版都行,关键保证升级到i是盗版)简单DP不用再说了,不过就是用到临界表来存储边,减小空间复杂度(姑且这样说)。#include<iostream>#include<cstdio>#include<c 阅读全文
posted @ 2012-05-03 21:13 书山有路,学海无涯 阅读(288) 评论(0) 推荐(0) 编辑
摘要: 令res[i][j][0]表示数字和为i,数字平方和为j的可能性,要么为0要么为1,;res[i][j][1]表示至少有多少位数字。res[i][j][0]=res[i-k][j-k*k] ? 1 : 0;(1<=k<=9 , 1<=i<=900,1<=j<=8100)res[i][j][1]=min(res[i][j],res[i-k][j-k*k]+1);然后根据res[i][j][1]寻找最优解需要预处理一下,不然可能TLE,之前没有预处理TLE了n次。。。。。。。#include<iostream>#include<cstdio&g 阅读全文
posted @ 2012-05-03 12:57 书山有路,学海无涯 阅读(211) 评论(0) 推荐(0) 编辑
摘要: 第一道树状数组,每个第一道都那么艰难……..#include<iostream>#include<cstdio>#include<cstring>using namespace std;#define MAX 1234567890int res[10010],data[10010];int lowbite(int x){ return x & (x^(x-1));}int GetSum(int i){ int t=0; while(i>0) { t+=res[i]; i-=lowbite(i); } return t;}int A... 阅读全文
posted @ 2012-05-01 22:08 书山有路,学海无涯 阅读(163) 评论(0) 推荐(0) 编辑
摘要: 令res[i][j]表示从i到j是否是回文串。res[i][j]= (str[i]==str[j] && res[i+1][j-1]) ;接下来是如何找最少个数回文串,令inum[i]表示从1到i至少有多少个回文串,再次用DP;inum[i]=min(inum[j]+1),(其中res[j][i]==1,1<=j<i);最后根据inum[i]的值寻找一种可行的方案。O(n^2)的时间复杂度,O(n^2)的空间复杂度,网上还有更好的代码,竟然没有看懂#include<iostream>#include<cstdio>#include<cs 阅读全文
posted @ 2012-05-01 16:16 书山有路,学海无涯 阅读(218) 评论(0) 推荐(0) 编辑
摘要: 一看题意,感觉可以用线段树来做,但是二维挺难处理的,后来百度了一下,大牛们是将二维化为一维,因为点已经排好了序,我们就可以省去了一维,只考虑x,然后就是赤裸裸的线段树了,而且还不用事先建树。#include<iostream>#include<cstdio>#include<cstring>using namespace std;struct node{ int x,y;}point[15010];int res[15010],tree[32000*4+10];int insert(int i,int left,int right,int x){ int m 阅读全文
posted @ 2012-04-30 18:11 书山有路,学海无涯 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 想一想知道n-1位的结果,如何得到n位的结果呢?假如我们知道n-1的后两位再枚举第n位的数字,不就得到n位的结果了吗?我们用res[n][i][j]表示n位最后两位是i和j;Res[i][j][k]=∑res[i-1][l][j];(其中100*l+10*j+k 是素数)我们还可以优化一下,因为最后一位只有可能是1、3、7、9。所以可以将k和j所在的循环的长度改为4。#include<iostream>#include<cstdio>#include<cstring>#include<cmath>using namespace std;int r 阅读全文
posted @ 2012-04-30 11:30 书山有路,学海无涯 阅读(181) 评论(0) 推荐(0) 编辑
摘要: 做了这道题我都快疯了,一开始不是道什么是散列化,看了半天才有点头绪,尝试写了,又遇到了问题,就是排序之后,如何确定新的区间,看看大牛的文章,就是看不懂,今天早上突然,灵光一闪,知道到底怎么回事了,也就是在排序的过程中,记录了染色区间的序号,以便于,散列后重新确定染色区间,就这么简单却弄了那么久,汗颜。后来,没有注意到题中给出的条件 起始点< 终点,是我一直在纠结始点等于终点的情况,唉!还有就是英语本身就不怎么样,竟然还忽略了另一个条件“open interval”,查了一下却是“开区间”的意思,导致我就是弄不明白sample output 中的47 634 是怎么来的,自己总认为是48 阅读全文
posted @ 2012-04-29 12:20 书山有路,学海无涯 阅读(173) 评论(0) 推荐(0) 编辑
上一页 1 2 3 4 5 6 7 8 ··· 11 下一页