您的位置:首页 > 运维架构

[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两个数字分别看成不同的极点。

#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;
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: