摘要: 完全的一道水题,因为它来自书本,嘻嘻while(cin>>(list1+1)>>(list2+1)){ int n1=strlen(list1+1); int n2=strlen(list2+1);这个是之前没有见过的一种输入法这种最长公共序列,倒是挺有必要掌握,人类基因图那一道题也是用这种方法的#include "iostream"#include "string.h"using namespace std;int dp[1000][1000];int max(int a,int b){return a>b?a:b;}in 阅读全文
posted @ 2013-08-23 21:16 龙城星 阅读(238) 评论(0) 推荐(0) 编辑
摘要: 之前在书里看过了,但是没有做过例题,忘记它的原理了dp[i][j]表示前i个数中选j段所能构成的最大值,(强调一下,这j段包括最后一个元素[i]的),这样第i个元素要不跟倒数第二个一起,要不独自形成一段——第j段dp[i][j]=max(dp[i-1][j], dp[i-len[j]][j-1]+sum) len[j]表示第j段的长度,sum表示长度为len[j]的当然得用优化算法,这是优化算法是在书里面看到的,挺巧妙的for(i=1;ib?a:b;}int pre[1000010],dp[1000010],num[1000010];int main(){ int m,n,i,j,max; . 阅读全文
posted @ 2013-08-23 14:18 龙城星 阅读(141) 评论(0) 推荐(0) 编辑
摘要: 一开始是一些不知道是什么的错误,访问到危险的空间啊,栈溢出啊,超时啊.....后来到网上看了人家的答案,才知道人家的运行时间真的很短,同样是LIS ,但是人家用了哈希查找,所以快了很多记住哈希查找最后是返回low#include "iostream"#include "string.h"using namespace std;int max(int a,int b){return a>b?a:b;}int f[1000000],num[1000000];int find(int low,int high,int i){ while(lowf[mid 阅读全文
posted @ 2013-08-23 11:54 龙城星 阅读(143) 评论(0) 推荐(0) 编辑
摘要: 一看到它就懵了,后来看了题解,原来这道题目跟我们以前学过的数学斜率知识很像,一阶的斜率为一个数,二阶的斜率为一个一阶数组.....所以用差分就可以解决这个问题说说我所犯下的错误吧——一个无形的空格号for(i=n+1;i>Case; while(Case--){ cin>>n>>m; for(i=1;i>num[i];f[0][i]=num[i];} for(i=1;i=0;i--){ for(j=n-i;j<=n+m;j++){ f[i][j]=f[i+1][j-1]+f[i][j-1]; } } //cout<<"numbe. 阅读全文
posted @ 2013-08-23 10:24 龙城星 阅读(175) 评论(0) 推荐(0) 编辑
摘要: 看了大神的题解才知道是怎么做的,状态压缩,好巧妙啊另外一个大神分析了这道题目为什么用不了贪心做法,我也不知道,因为还没有怎么用过贪心做法,只知道贪心算法在某些题型中才可以用,比如节目安排压缩状态:3个状态,1 02 13 0 1 1 04 25 2 0 0 26 2 1 1 27 0 1 2 1 0 2 2 0 1 0 2 1 2 1 0 1 2 0最后呢,每种情况都列出来了看完大神的代码后,我自己也打了一个,一开始提交是错误的,后来对着修改了起来,原来数组开得不够大#include "iostream"#define INF 10000000;u... 阅读全文
posted @ 2013-08-23 09:50 龙城星 阅读(173) 评论(0) 推荐(0) 编辑