博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 6103
阅读量:6905 次
发布时间:2019-06-27

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

题意:

求最长的两个不相交的子序列,dis <= m ;

 

分析:

当时二分了答案,暴力匹配,TLE了,然后考虑了,O(n^2)预处理出所有区间 dis,然后答案是所有dis中>=m的最长长度吗?

不是,两个子区间可以不相邻。

 

还是二分答案,还是枚举两个区间的位置,这里已经是O(n^2)了,怎么判断他们的dis呢? 

利用上面求出的任意两个区间的dis O(1)求出这两个子区间的dis,dis = d[i][j+mid-1] - d[i+mid][j-1];

 

int 的二维开不了!

 

字符串细节很多!!!

#include
using namespace std;const int maxn = 5005;char str[5005];unsigned short d[maxn][maxn];int len, m;bool judge(int mid){ for(int i=1; i<=len; i++) { if(i+mid*2-1>len) break; for(int j= i + mid; j<=len; j++) { if(j+mid-1>len) break; if(d[i][j+mid-1]-d[i+mid][j-1]<=m) return true; } } return false;}int main(){ int t; scanf("%d", &t); while(t--) { scanf("%d", &m); scanf("%s", str+1); len = strlen(str+1); for(int i=0; i<=len; i++) d[i][i] = 0; for(int k=1; k<=len; k++) { for(int i=1; i<=len; i++) { int j = i + k - 1; if(j>len) break; if(j-i==1) d[i][j] = abs(str[i]-str[j]); else d[i][j] = d[i+1][j-1] + abs(str[i]-str[j]); } } int left = 1,right=len/2,ans=-1; while(left <=right) { int mid = (left + right) / 2; if(judge(mid)) { ans = mid; left = mid + 1; } else right = mid - 1; } if(ans==-1) ans = 0; printf("%d\n", ans); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/TreeDream/p/7344532.html

你可能感兴趣的文章
MS DTC 无法正确处理DC升级/降级事件。MS DTC 将继续运行并使用现有的安全设置。...
查看>>
CAN总线基础
查看>>
第3课 QT的诞生和本质
查看>>
CentOS6.8下安装Docker
查看>>
JavaScript HTML Handlebars Template
查看>>
java.lang.NumberFormatException 错误及解决办法
查看>>
python:大量参数如何传递
查看>>
curl 跨域请求回来的json数据带有BOM 字符\ufeff,掉诡异的BOM \ufeff
查看>>
Javascript下的AJAX
查看>>
<c:out>标签中的escapeXML属性
查看>>
Ado.Net Helper
查看>>
OpenWrt Web界面修改及功能实现实例说明
查看>>
java内存溢出的解决思路
查看>>
hibernate(六)一对一映射
查看>>
map遍历
查看>>
android结合Jenkins使用V2签名
查看>>
栏目添加缩略图
查看>>
[BZOJ 1221][HNOI2001]软件开发(费用流)
查看>>
用户注册流程分析
查看>>
6.1Python数据处理篇之pandas学习系列(一)认识pandas
查看>>