博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最长单调子序列及计数(poj1952)
阅读量:6252 次
发布时间:2019-06-22

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

  被这个问题困住了,就像憋了一泡屎,但是便秘了,不往下说了,你懂的。

  在网上查了各种资料,各种文章,其实大家说的都差不多,无非是枚举、求该序列和它的排序后的序列的最大公共子序列、动态规划、基于〈二分法和统计研究〉论文。最基本最正常路子应该是动态规划,很多人会给出一个公式,然后给出一段代码,我看了很多,最终只看懂了一个。描述如下:

  比如:另d[i]表示数列1i i结尾的最大长度值, 而令d[i] = max{ d[j]+1} 1<=j<=i-1 && a[j] > a[i])也就是说,对于每个可以接上的值, 都有a[j] > a[i](递减), 看谁能接的长自然就是最优解了。如果没有可接的, 就说明对于a[i]前边的没一个值, 都有a[j]>a[i] 也就是说a[i]是迄今位置最大的数了, 那么有d[i] = 1;

  单看这个,想写出程序来也很难,所以,最好还是直接看程序。

  对于poj上的1952题,难点其实是在计数上,m[i]用来存放计数,何时初始化计数?计数如何增加?如何防止重复?这是几个要考虑的问题,答案都在代码中了。

输入用例:

12 68 69 54 64 68 64 70 67 78 62 98 87

输出用例:

4 2 //最长是4;有2个长度为4的子序列

源程序:

1 #include 
2 int array[5000+1]; 3 int d[5000+1]; 4 int m[5000+1]; 5 int lds(int n) 6 { 7 int max; 8 int i, j; 9 for(i=n-1; i>=0; --i)10 {11 for(j=i+1; j
array[j])14 {15 if(d[i] < d[j]+1)16 {17 d[i] = d[j]+1;18 m[i] = m[j];19 }20 else if(d[i] == d[j]+1)21 {22 m[i] += m[j];23 }24 }25 else if(array[i] == array[j])26 {27 if(d[i] == 1)28 {29 m[i] = 0;30 }31 break;//防止重复32 }33 }34 }35 for(i=0, max=0; i

 

 

转载于:https://www.cnblogs.com/favourmeng/archive/2012/08/28/2660200.html

你可能感兴趣的文章
解决win7麦克风音量老是自动变来变去问题
查看>>
linux系统时间同步,硬件时钟和系统时间同步,时区的设置
查看>>
CentOS下载包格式说明
查看>>
VMware Vsphere 6.0安装配置 二安装vcenter server程序
查看>>
关于CISCO asa5510防火墙端口映射配置
查看>>
3月上旬全球域名解析服务商TOP15 中国仅万网上榜
查看>>
2012年6月美国最佳虚拟主机提供商TOP12性能评测
查看>>
monkey详细介绍之二
查看>>
2019东北四省B,G,H,J 2018宁夏 A,F
查看>>
初学者第04节之数据类型(上)
查看>>
两列布局之左边固定宽度,右边自适应(绝对定位实现方法)
查看>>
4,gps信号与地图匹配算法
查看>>
python print的用法
查看>>
之字形打印矩阵
查看>>
10月10日学习内容整理:socketserver模块,ftp作业讲解
查看>>
我的世界之电脑mod小乌龟 —— 方位上的操作 lua函数集
查看>>
游戏方案
查看>>
Java设计模式
查看>>
在 Linux 下搭建 Git 服务器
查看>>
为什么中国高速收费,美国高速却大规模免费?
查看>>