博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TopCoder-SRM635-DIV1-250pt-SimilarRatingGraph-枚举+边界处理
阅读量:5086 次
发布时间:2019-06-13

本文共 1957 字,大约阅读时间需要 6 分钟。

http://community.topcoder.com/stat?c=problem_statement&pm=13485&rd=16078

很容易枚举,令(p,q)表示分别以其为结尾的相似的折线。则可以从p-1和q-1开始向前搜索判断这个子串是否符合题目要求。然后计算出折线的长度并统计出最大的即可。

主要难点在于理解什么样的两个串是相似的。并且找到一种能够不用除法的方式向前搜索以避免精度对其的影响。我的实现用了递归,其实没有必要。O(n^3)

vector
d; vector
r; bool dpf[MAX_N+1][MAX_N+1]; double dp[MAX_N+1][MAX_N+1]; double Solve(int p,int q){ if (p==0 || q==0) return 0; if(dpf[p][q]){ return dp[p][q];} double res=0; res=max(res,Solve(p-1,q)); res=max(res,Solve(p,q-1)); if (p==q) { dpf[p][q]=true; dp[p][q]=res; return res; } int l=0; int fdd1,fdd2; while(p-1-l>=0 && q-1-l>=0){ if (l==1){ fdd1=d[p-2]-d[p-1]; fdd2=d[q-2]-d[q-1]; } if(l>=1){ int dd1=d[p-1-l]-d[p-l]; int dd2=d[q-1-l]-d[q-l]; int dr1=r[p-1-l]-r[p-l]; int dr2=r[q-1-l]-r[q-l]; if (dd1*fdd2!=dd2*fdd1) break; if (dr1*fdd2!=dr2*fdd1) break; } l++; } double len=0; for(int i=1;i
1){ int aaa=1; } dpf[p][q]=true; dp[p][q]=res; return res; } double maxLength(vector
date, vector
rating) { d=date; r=rating; n=d.size(); memset(dpf,false,sizeof(dpf)); return Solve(n,n); }

 

转载于:https://www.cnblogs.com/yangsc/p/4047016.html

你可能感兴趣的文章
阿里云ssh断开处理办法
查看>>
lua创建文件
查看>>
面向对象 空参有参构造
查看>>
抓老鼠啊~亏了还是赚了?
查看>>
oc29--property修饰符
查看>>
oc63--协议@protocol1
查看>>
mybatis14 动态sql
查看>>
MySQL5.7免安装版配置图文教程
查看>>
Linux的进行端口转发的命令
查看>>
javaScript函数节流与函数防抖
查看>>
移动端点击图片查看大图
查看>>
Linux安装redis数据库及添加环境变量
查看>>
Mysql索引和性能优化笔记
查看>>
oracle sql 性能 优化
查看>>
pm2 日常使用
查看>>
H5+SDK
查看>>
Linux命令:用“dirs”、“pushd”、“popd”来操作目录栈
查看>>
sqlserver2016 management tool v18
查看>>
C#/.NET 实现MD5加密的简单写法
查看>>
1217.2——定义一个类+方法声明调用
查看>>