当前位置: 代码迷 >> 综合 >> HOJ 1087 Super Jumping!(最长严格递增子序列)
  详细解决方案

HOJ 1087 Super Jumping!(最长严格递增子序列)

热度:72   发布时间:2023-12-13 18:55:40.0

最长严格递增子序列
题目意思:
求解最大递增子序列和,这里要特别注意一点:这个题目不要求是连续的最大递增子序列。
但是一定要注意是递增的!!
本题要点:
1、裸题的 LIS. n <= 1000, 复杂度 O(n^2).
dp[i] 表示以i结尾的,最长严格递增子序列总和.然后套用 LIS 的模板, 得到数组 dp, 在dp 中找到最大值即可。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int MaxN = 1010;
long long h[MaxN];
long long dp[MaxN];	// dp[i] 表示以i结尾的,最长严格递增子序列总和
int n;void solve()
{
    long long ans = h[1];dp[1] = h[1];for(int i = 2; i <= n; ++i){
    int max_sum = h[i];for(int j = 1; j < i; ++j){
    if(h[j] < h[i]){
    if(max_sum < dp[j] + h[i]){
    max_sum = dp[j] + h[i];}}}dp[i] = max_sum;if(ans < dp[i]){
    ans = dp[i];}}printf("%lld\n", ans);
}int main()
{
    while(scanf("%d", &n) != EOF && n){
    for(int i = 1; i <= n; ++i){
    scanf("%lld", &h[i]);}solve();}return 0;
}/* 3 1 3 2 4 1 2 3 4 4 3 3 2 1 0 *//* 4 10 3 */
  相关解决方案