[Topcoder]ZigZag(dp)
2016-06-21 16:40
197 查看
题目链接:https://community.topcoder.com/stat?c=problem_statement&pm=1259&rd=4493
题意:给一串数字,求出最长的波动序列。波动的定义是一个数相邻的两个数同时比他大或者同时比他小,形象的看成一个波动的三角函数吧。
定义dp(i)为到第i个数字时的最长波动序列长度,我们发现仅有一维的数组是存不下状态的,还应该再维护一个量,那就是第i个数字的时候他是波峰还是波谷。于是dp数组扩展成了dp(i,k),k可以取0或1分别表示是波峰还是波谷。更新的时候枚举第j(1~i-1)个数字,如果第i个数字和第j个数字不相同就更新,更新的时候要把i和j两个数字分别看成不同的极点。
题意:给一串数字,求出最长的波动序列。波动的定义是一个数相邻的两个数同时比他大或者同时比他小,形象的看成一个波动的三角函数吧。
定义dp(i)为到第i个数字时的最长波动序列长度,我们发现仅有一维的数组是存不下状态的,还应该再维护一个量,那就是第i个数字的时候他是波峰还是波谷。于是dp数组扩展成了dp(i,k),k可以取0或1分别表示是波峰还是波谷。更新的时候枚举第j(1~i-1)个数字,如果第i个数字和第j个数字不相同就更新,更新的时候要把i和j两个数字分别看成不同的极点。
#include <string> #include <vector> #include <sstream> #include <algorithm> #include <iostream> #include <cstring> using namespace std; class ZigZag { public: int longestZigZag(vector<int> sequence) { int dp[101010][2]; int n = sequence.size(); int a[101010]; int ret = 0; memset(dp, 0, sizeof(dp)); for(int i = 1; i <= n; i++) a[i] = sequence[i-1]; for(int i = 1; i <= n; i++) { dp[i][0] = dp[i][1] = 1; for(int k = 0; k < 2; k++) { for(int j = 1; j <= i; j++) { if(a[i] == a[j]) continue; if(k == 0) { if(a[i] < a[j]) dp[i][k] = max(dp[i][k], dp[j][!k]+1); } else { if(a[i] > a[j]) dp[i][k] = max(dp[i][k], dp[j][!k]+1); } } ret = max(ret, max(dp[i][0], dp[i][1])); } } return ret; } };
相关文章推荐
- 在调用popen时报错popen:: Cannot allocate memory
- Linux常用命令汇总-head
- linux系统之上搭建maven 之nexus服务篇
- windows配置iis网站域名
- centos安装jansson
- Linux常用命令汇总-less
- Mybatis 传入List类型参数,报错:There is no getter for property named '__frch_item_0' in
- 正确的重载operator+
- Linux 报错could not update ICEauthority file 解决方法
- linux 常用makefile模板
- adb shell出错“error: unknown host service”
- (转)Linux NUMA引发的性能问题
- 每天一个Linux命令(02)--cd命令
- (转)Linux常用性能检测命令
- Linux驱动修炼之道-SPI驱动框架源码分析(上)【转】
- (转)《linux性能及调优指南》 3.3 内存瓶颈
- Linux SPI总线和设备驱动架构之一:系统概述【转】
- MooseFS分布式文件系统+keepalived高可用+unison和intoify实时双机同步(三)
- 从串口驱动的移植看linux2.6内核中的驱动模型 platform device & platform driver【转】
- .Net Core Linux centos7行—安装nginx,运行静态网站