1017. The Best Peak Shape (35)解题报告

来源:互联网 发布:淘宝客服绩效考核工具 编辑:程序博客网 时间:2024/06/12 18:06

原题链接:

1017. The Best Peak Shape (35)

解题思路:

  1. 对于每个元素,求以其结尾的最长严格递增子序列。Ii是以下标为i元素结尾的最长严格递增子序列。
  2. 对于每个元素,求以其开头的最长严格递减子序列。Di是以下标为i元素开头的最长严格递减子序列。
  3. 遍历每个元素,求Ii+Di-1最大者。

通过画面:

代码:

#define _CRT_SECURE_NO_WARNINGS#include <cstdio>#include <cstdlib>#include <cassert>#include <cmath>#include <algorithm>#include <vector>using namespace std;int main(){int n = 0;assert(1 == scanf("%d", &n));vector<int> input(n + 1, 0), forward(n + 1, 0), backward(n + 1, 0);for (int i = 1; i <= n; i++) {int tmp = 0;assert(1 == scanf("%d", &tmp));input[i] = tmp;}for (int i = 2; i <= n; i++) {for (int j = i - 1; j >= 1; j--) {if (input[i] > input[j]) {forward[i] = max(forward[i], forward[j] + 1);}}}for (int i = n - 1; i >= 1; i--) {for (int j = i + 1; j <= n; j++) {if (input[i] > input[j]) {backward[i] = max(backward[i], backward[j] + 1);}}}int maxLen = 0, index = 0, value = 0, diff = 100000;for (int i = 2; i < n; i++) {if (forward[i] && backward[i]) {if (forward[i] + backward[i] + 1 > maxLen) {maxLen = forward[i] + backward[i] + 1;index = i;value = input[i];diff = abs(forward[i] - backward[i]);}else if (forward[i] + backward[i] + 1 == maxLen && diff > abs(forward[i] - backward[i])) {index = i;value = input[i];diff = abs(forward[i] - backward[i]);}}}if (maxLen) {printf("%d %d %d\n", maxLen, index, value);}else {puts("No peak shape");}return 0;}

原创粉丝点击