最长单调子序列及计数(poj1952)

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

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

  比如:另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 <stdio.h>
 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<n; ++j)
12         {
13             if(array[i] > 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<n; ++i)
36     {
37         if(max < d[i])
38         {
39             max = d[i];
40         }
41     }
42     int maxm;
43     for(i=0, maxm=0; i<n; ++i)
44     {
45         if(d[i] == max)
46         {
47             maxm += m[i];
48         }
49     }
50     printf("%d %d\n", max, maxm);
51     return 0;
52 }
53 int main()
54 {
55     int i=0;
56     int nLastNum = -1;
57     int nArrayLen;
58     scanf("%d", &nArrayLen);
59     i=0;
60     while(i < nArrayLen)
61     {
62         scanf("%d", &array[i]);
63         m[i] = 1;
64         d[i] = 1;
65         ++i;
66     }
67     while(i<5001)
68     {
69         m[i] = 1;
70         d[i] = 1;
71         ++i;
72     }
73     lds(nArrayLen);
74     return 0;
75 }

 

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ACM学习历程—51NOD 1685 第K大区间2(二分 树状数组 中位数)

http://www.51nod.com/contest/problem.html#!problemId1685 这是这次BSG白山极客挑战赛的E题。 这题可以二分答案t。 关键在于&#xff0c;对于一个t&#xff0c;如何判断它是否能成为第k大。 将序列中大于t的置为1&#xff0c;小于t的置为-1&#xff0c;等于t的置为0。那么区…

vue项目请求封装;axios封装使用

vue项目&#xff0c;封装axios请求方式和响应状态码&#xff1b;以及接口的api封装&#xff1b; 目录结构&#xff1a; 1.具体在src/utils/request.js下封装axios&#xff1a; ①引入axios和router ②引入element-ui是为了用提示组件 和加载组件&#xff08;可选择去掉&#…

【Bash】实现指定目录下的文件编码转换,以原文件名保存

文件名: encodeExchange.sh Linux版本&#xff1a; #!/bin/bashfEncodeUTF-8 tEncodeGBK#fEncodeGBK #tEncodeUTF-8files"Classes/*"# convert files encoding from GBK->UTF-8 or UTF-8->GBK convertFileEncode() {if [ $# -lt 3 ]; thenecho "Usage: …

linux下恢复误删文件

linux下文件实际上是一个指向inode的链接, inode链接包含了文件的所有属性, 比如权限和所有者, 数据块地址(文件存储在磁盘的这些数据块中). 当你删除(rm)一个文件, 实际删除了指向inode的链接, 并没有删除inode的内容. 进程可能还在使用. 只有当inode的所有链接完全移去, 然后…

mysql中的boolean tinyint

由于mysql 里没boolean&#xff1b;tinyint为 数据类型 &#xff0c;so 当存入true时&#xff0c;自动转换成1 ;

顺序查找(Sequential Search)

1、定义 顺序查找又叫线性查找&#xff0c;是最基本的查找技术。 2、基本思想 从表的一端开始&#xff08;第一个或最后一个记录&#xff09;&#xff0c;顺序扫描线性表&#xff0c;依次将扫描到的结点关键宇和给定值K相比较。若当前扫描到的结点关键字与K相等&#xff0c;则查…

简单的封装axios 不包含状态码和提示

复杂封装&#xff0c;包含提示和状态码的&#xff0c;点击这里查看 以下是简单封装axios的request.js文件&#xff1a; import axios from axios import router from ./../router import { Message } from element-ui// 设置axios全局默认的BASE-URL&#xff0c; 只要设置了全…

精确记录和恢复ListView滑动位置

工作中遇到一个需求&#xff0c;对ListView某一项操作后刷新ListView&#xff0c;但是如果直接刷新&#xff0c;界面上ListView从第一列开始显示&#xff0c;用户体验不好&#xff0c;于是在网上搜了一些恢复LIstView滑动位置的方法。解决办法如下&#xff1a; //给ListView设置…

时间戳倒计时

var defaultTimeStamp Math.floor(Date.now()/1000);var dayA defaultTimeStamp % (24 * 3600) //除去天数&#xff0c;得到剩余的小时时间戳var hourA dayA % (3600) //除去小时&#xff0c;得到剩余的分钟数时间戳var minuteA hourA % (60) …

python中使用sys模板和logging模块获取行号和函数名的方法

From: http://www.jb51.net/article/49026.htm 这篇文章主要介绍了python中使用sys模板和logging模块获取行号和函数名的方法,需要的朋友可以参考下对于python&#xff0c;这几天一直有两个问题在困扰我: 1.python中没办法直接取得当前的行号和函数名。这是有人在论坛里提出的问…

第二阶段冲刺(五)

昨天云服务 今天云服务 遇到的问题 转载于:https://www.cnblogs.com/qianxia/p/5525095.html

axios的content-type是自动设置的吗?

是根据提交的数据根式自动设置的 三种常见post提交和方式 axios中使用qs

MyBatis MapperScannerConfigurer配置——MyBatis学习笔记之八

在上一篇博文的示例中&#xff0c;我们在beans.xml中配置了studentMapper和teacherMapper&#xff0c;供我们需要时使用。但如果需要用到的映射器较多的话&#xff0c;采用这种配置方式就显得很低效。为了解决这个问题&#xff0c;我们可以使用MapperScannerConfigurer&#xf…

本地ip出口查询

获取/查看本机出口ip curl http://members.3322.org/dyndns/getip

使用Python获取Linux系统的各种信息

From: http://www.jb51.net/article/52058.htm 这篇文章主要介绍了使用Python获取Linux系统的各种信息,例如系统类型、CPU信息、内存信息、块设备等,需要的朋友可以参考下在本文中&#xff0c;我们将会探索使用Python编程语言工具来检索Linux系统各种信息。走你。 哪个Python版…

本地如何搭建IPv6环境测试你的APP

IPv6的简介 IPv4 和 IPv6的区别就是 IP 地址前者是 .&#xff08;dot&#xff09;分割&#xff0c;后者是以 :&#xff08;冒号&#xff09;分割的&#xff08;更多详细信息自行搜索&#xff09;。 PS&#xff1a;在使用 IPv6 的热点时候&#xff0c;记得手机开 飞行模式 哦&am…

HDU 2376 Average distance

HDU_2376 对于任意一棵子树来讲&#xff0c;以根节点为深度最浅的点的路径一共有两类&#xff0c;一类是以根节点为端点的路径&#xff0c;另一类是过根节点但端点分别在两棵子树中的路径。然后将无根树转化为有根树后dfs时计算出上面两类路径的长度即可。 #include<stdio.h…

meta http-equiv属性兼容浏览器_定时刷新

<meta http-equiv"X-UA-Compatible" content"IEedge"> #以上代码告诉IE浏览器&#xff0c;IE8/9及以后的版本都会以最高版本IE来渲染页面。 <meta http-equiv"refresh" content"30"> #每30秒钟刷新当前页面:

使用 Python 获取 Linux 系统信息的代码

From: http://www.jb51.net/article/52107.htm 在本文中&#xff0c;我们将会探索使用Python编程语言工具来检索Linux系统各种信息,需要的朋友可以参考下哪个Python版本? 当我提及Python&#xff0c;所指的就是CPython 2(准确的是2.7).我会显式提醒那些相同的代码在CPython 3 …

利用FPGA加速实现高性能计算

原文链接 原因&#xff1a;处理器本身无法满足高性能计算(HPC)应用软件的性能需求&#xff0c;导致需求和性能 之间出现了缺口。最初解决办法&#xff1a;使用协处理器来提升处理器的性能。协处理器&#xff08;基于硬件的设计&#xff09;具有三种能力&#xff1a;1.专门的硬件…