TopCoder—ZigZag
来源:互联网 发布:c语言九九乘法编程 编辑:程序博客网 时间:2024/06/16 11:48
题目描述:http://community.topcoder.com/stat?c=problem_statement&pm=1259&rd=4493
题目大意如下——定义Zig-Zag序列:相连数字之间的差严格地正数和负数之间波动,不能是0。例如,(1,7,4,9,2,5)是Zig-Zag序列,而(1,4,7,2,5)和(1,7,4,5,5)不是Zig-Zag序列。现在给定一串序列,求其中最长的Zig-Zag子序列的长度。
思路:和求解最长上升子序列的思想一样,len[i]表示以num[i]结尾的最长Zig-Zag子序列长度,len[i]=max { len[j]+1 | 1<=j<i&&num[i]和以num[j]结尾的Zig-Zag子序列构成合法的Zig-Zag子序列},要注意的是,对相同元素序列地特判。
public class ZigZag {public int longestZigZag(int[] sequence){if(sequence.length==1) return 1;int[] pre = new int[sequence.length]; int[] len = new int[sequence.length];pre[0] = 0;len[0] = 1;if(sequence[0] != sequence[1]){pre[1] = 0;len[1] = 2;}else{pre[1] = 1;len[1] = 1;}int ans = len[1];for(int i=2;i<sequence.length;i++){int tmp = -1;for(int j=0;j<i;j++){if(j==pre[j]){if(sequence[i]!=sequence[j]){if(len[j]+1>tmp){tmp = len[j]+1;pre[i] = j;}}else{if(1>tmp){tmp = 1;pre[i] = i;}}}else{if((sequence[i]>sequence[j])&&(sequence[pre[j]]>sequence[j])){if(len[j]+1>tmp){tmp = len[j]+1;pre[i] = j;}}else if((sequence[i]<sequence[j])&&(sequence[pre[j]]<sequence[j])){if(len[j]+1>tmp){tmp = len[j]+1;pre[i] = j;}}}}len[i] = tmp;if(len[i]>ans) ans = len[i];}return ans;}}
1 0
- TopCoder—ZigZag
- 【DP】TopCoder 赛题 ZigZag
- 【TopCoder】ZigZag - 2003 TCCC Semifinals 3
- Topcoder:Zigzag 最长的大小交替子数组
- TopCoder:ZigZag(动态规划--最长非降子序列)
- TopCoder
- topcoder
- Topcoder
- topcoder
- topcoder
- Topcoder
- 【leetcode】6—Zigzag
- LeetCode6—ZigZag Conversion
- leetcode—zigzag conversion
- zigzag
- zigzag
- ZigZag
- zigzag
- 使用信用卡 要避开这些陷阱
- HDU 1248 寒冰王座(完全背包)
- KUbuntu/Ubuntu 14.04 (降级)安装 svn 1.7
- erlang mnesia
- Servlet系列(二)----Servlet基础
- TopCoder—ZigZag
- POJ 1742 Coins(多重背包)
- java 1加到100
- XDOJ1170 - 蛋疼的游戏
- hdu 3682
- 在线分享Oracle尖峰时刻--2014年中秋节尖峰在线福利!
- dancing link 资料
- POJ 2063Investment(完全背包)
- Java开发中的23种设计模式详解