博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sdut 1451 括号东东 (dp或模拟)
阅读量:7307 次
发布时间:2019-06-30

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

题目:http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1451

这个题弄了好久,其实这个中文就挺难理解的,,一开始理解错题意了,,

然后后来问了问ZJH学长题意,弄明白的,提交之后还是不对,后来回到宿舍之后问了问LMM学姐,感觉他的方法很好还有就是用dp了

一、用栈模拟

思路:利用一个标记数组,a[],用于记为第i个字符是否为合法字符,若是则标记为1,否则标记为0,

最后便利一遍,最长合法字串就是最长的连续的1的长度,子串的个数就是有几段连续的i就是几

二、dp

dp[]数组存储i位置最长的合法子串的长度,

代码:

View Code
1 #include 
2 #include
3 #include
4 using namespace std; 5 char str[1000010]; 6 int dp[1000010]; 7 int main() 8 { 9 10 while(scanf("%s",str)!=EOF)11 {12 int len=strlen(str);13 int i;14 dp[0]=0;15 int sum=0,num=1;16 for(i=1;i
=0&&str[i]==')'&&str[i-dp[i-1]-1]=='(')//有与i位置的‘)’匹配的‘(’19 {20 dp[i]=dp[i-1]+2;21 if(i-dp[i-1]-2>=0&&dp[i-dp[i-1]-2]!=0)//如果与i位置匹配的位置的前一位置还有匹配的括号时,要加上那个位置的值22 {23 dp[i]+=dp[i-dp[i-1]-2];24 }25 if(dp[i]>sum)26 {27 sum=dp[i];28 num=1;29 }30 31 else if(sum==dp[i]&&sum!=0)32 {33 num++;34 }35 }36 else37 {38 dp[i]=0;39 }40 }41 cout<
<<" "<
<

 

 

转载于:https://www.cnblogs.com/wanglin2011/archive/2013/01/27/2879011.html

你可能感兴趣的文章
Java中finally块报finally block does not complete normally
查看>>
鸟哥的Linux私房菜10.15 档案与文件系统的压缩与打包
查看>>
类豌豆荚: Linux Mint实测QtADB安卓管理客户端
查看>>
SpringBoot之Starter相关说明
查看>>
LVS 负载均衡集群学习笔记
查看>>
一个根据内存使用情况重启tomcat的小脚本
查看>>
kickstart命令及安装引导光盘的制作
查看>>
docker 安装配置
查看>>
rsync:include和exclude参数
查看>>
指针和链条
查看>>
Getting Started with FFmpeg/libav using NVIDIA GPUs
查看>>
jQuery选择器和事件
查看>>
angular2 返回一个数组里面的内容禁用 新增一天是可编辑的状态
查看>>
喜迎2015年新年:坦克大战(Robocode)游戏编程比赛图文总结
查看>>
ETCD集群部署
查看>>
oracle 10046
查看>>
javascript中的焦点管理
查看>>
记一次网项目(一)
查看>>
拆分一个大文件(linux)
查看>>
javascript-事件默认行为/右键菜单、拖拽
查看>>