
OJ
jiaowopan
这个作者很懒,什么都没留下…
展开
-
POJ1458 LCS
经典动态规划例子,算法导论上有介绍。设X=(X1,X2,...Xm), Y=(Y1,Y2,...,Yn), dp[i][j]代表X1...Xi 和Y1...Yj 的最长公共子序列,我们要求到是dp[m][n].if Xi==Yj dp[i][j]=dp[i-1][j-1]+1else dp[i][j]=Max(dp[i-1][j],dp[i][j-1])原创 2013-04-04 10:16:00 · 438 阅读 · 0 评论 -
O(n)求最长回文子串
转自:http://bbs.dlut.edu.cn/bbstcon.php?board=Competition&gid=23474 其实原文说得是比较清楚的,只是英文的,我这里写一份中文的吧。 首先:大家都知道什么叫回文串吧,这个算法要解决的就是一个字符串中最长的回文子串有多长。这个算法可以在O(n)的时间复杂度内既线性时间复杂度的情况下,求出以每个字符为中心的最长回文有多转载 2013-07-04 14:52:55 · 900 阅读 · 0 评论 -
HDU 2073 贪心
排序+贪心 #include #include #include #include #include #include using namespace std;const int MAXNUM = 105; struct Node{ int begin,end; Node(int a,int b):begin(a),end(b) {}};原创 2013-05-08 15:21:58 · 508 阅读 · 0 评论 -
剑指offer第6题 二叉树重建 九度OJ1385
剑指offer书中有个小错误,就是在57页第9行代码,在中序遍历中找根节点的值int* rootInorder = startInorder;while(rootInorder <= endInorder && *rootInorder != rootvalue) ++ rootInorder;应该改为int* rootInorder = startInorder;原创 2013-05-09 16:13:18 · 555 阅读 · 0 评论 -
剑指offer第3题 二维数组的查找 九度OJ 1384
//剑指offer第3题 二维数组的查找#include #include #include #include using namespace std;int arr[1005][1005];int m,n,t;bool bFind(int x,int y){ if(x > m || y < 1) return false; whil原创 2013-05-09 14:13:27 · 573 阅读 · 0 评论 -
HDU1050 区间覆盖
#include #include #include using namespace std;const int MaxNum = 205;int p[MaxNum];int main(){ //freopen("HDU1050.txt","r",stdin); int n,m,s,t,tmp; scanf("%d",&n); while(n--原创 2013-05-08 16:41:17 · 709 阅读 · 0 评论 -
POJ1163
//dp入门dp[i][j]表示以(i,j)为终点到最长路径dp[i][j]=max(dp[i-1][j],dp[i-1][j-1])+data[i][j]注意边界点#include #include #include #include using namespace std;int data[105][105];int dp[105][105];int ma原创 2013-03-27 20:50:42 · 442 阅读 · 0 评论 -
POJ3624 01背包
#include #include #include using namespace std;int f[13000],c[3500],w[3500];int main(){ int n,m; while(cin>>n>>m) { memset(f,0,sizeof(f)); memset(c,0,sizeof(c)); memset(w,0,sizeof(w))原创 2013-03-27 20:05:12 · 418 阅读 · 0 评论 -
北大POJ1276 多重背包
//多重背包问题,二进制划分#include #include #include using namespace std;int f[100050],c[10050];int main(){ int sum,n; while(cin>>sum>>n) { memset(f,0,sizeof(f)); memset(c,0,sizeof(c)); int i,j,原创 2013-03-27 19:55:23 · 555 阅读 · 0 评论 -
POJ3628 背包问题
//01背包问题,容量为S,c[i]=w[i]=Hi,最后遍历f[],找出最小到>=b的值即可#include #include #include #include using namespace std;int f[1000050],c[25];int main(){ int sum,n,b; while(cin>>n>>b) { sum=0; memset(f,0原创 2013-03-27 19:57:07 · 506 阅读 · 0 评论 -
北大POJ1088 dp入门
#include #include #include using namespace std;int len[105][105];int height[105][105];int max(int a,int b,int c,int d){ int e = a > b ? a : b; int f = c > d ? c : d; return e > f ? e : f;原创 2013-03-27 19:51:52 · 674 阅读 · 0 评论 -
浙大PAT1002
#include #include #include #include using namespace std;int main(){ int k=0,ex=0; double coe=0; map imap; typedef map::iterator ITE; cin>>k; while(k--) { cin>>ex>>coe; imap.insert(ma原创 2013-03-20 23:59:47 · 475 阅读 · 0 评论 -
POJ1160 dp
求:在村庄内建邮局,要使村庄到邮局的距离和最小。设有m个村庄,分别为 V1 V2 V3 … Vm, 要建n个邮局,分别为P1 P2 P3 … Pn。在DP的问题中,经常有从m个物体中选n个物体的情况,本题显然也属于这种情况。一般可以这样考虑:假设已经选了1个,那么就成了在m-1个中选n-1个的问题了。对于此题,也可以考虑先建一个邮局。建在哪里呢?不妨设,该邮局建在Vk+1..Vm之间的原创 2013-04-08 13:28:12 · 477 阅读 · 0 评论 -
POJ1141 dp
设原括号序列为S1 S2 … Sn。如果S1和 Sn匹配,则相当于求S2 … Sn-1的括号匹配情况。这时最终的匹配结果是:先打印S1,再打印S2 … Sn-1的括号匹配结果,最后打印Sn。如果S1和 Sn不匹配,怎么办呢?如果把S1 S2 … Sn从中间某个位置(比如Sk)分成两截,问题就变成S1 … Sk和Sk+1 … Sn的情况了。也就是说,把原问题划分成了两个结构相同的子问题。那么转载 2013-04-07 18:04:04 · 473 阅读 · 0 评论 -
POJ1050 dp入门
先来看最大子序列和。有一串数,有正有负,如2,-1,5,4,-9,7,0,3,-5。求:这一串数中,和最大的一段。比如说,从第一个数2开始,发现下一个为-1,加下-1后和显然会变小。再往后看,第三个数是5,所以上一个-1还是要选的,这样才能加上5。哎,不看了,这样求最大和还不得累死。嘿嘿,这时DP就派上用场了。 设这串数为X1 X2 X3 … Xn, 用dp(i,j)表示从Xi…Xj的最大原创 2013-04-03 20:08:56 · 503 阅读 · 0 评论 -
POJ1159 dp入门
求:为了使字符串左右对称,应该插入的最小字符数目。设字符串为S1 S2 S3 … Sn. 这个字符串有n个字符,根据DP的基本思路,减少问题规模。如果S1和Sn匹配,则只关心S2 S3 …Sn-1,就这样问题规模减少了。如果S1和Sn不匹配,那就有两种办法。方法1:加入S1’,字符串成S1S2 S3 … Sn S1’,则问题转化为S2 S3 … Sn。方法2:加入Sn’,字符串成Sn’原创 2013-04-03 20:38:19 · 513 阅读 · 0 评论 -
POJ3903 最长递增子序列
最长递增子序列,传统方法用dp思想,状态转移方程如下: dp[i] = Max{dp[j] | j 传统写法是求dp[i]时枚举所有小于i的j,然后找一个最大的,最后加1得到dp[i],此方法复杂度是O(n^2)有一种优化到O(n logn)的方法是这样的:用maxV辅助数组,maxV[i] 代表长度为i的递增子序列的最大元素的最小值。我们会发现该数组是有序的,原创 2013-10-05 17:43:17 · 630 阅读 · 0 评论