HDU 1087 Super Jumping! Jumping! Jumping! (LIS的最大和)

题意:

给定n个数的序列, 找出最长上升子序列和。

分析:

#include<cstdio>
#include<iostream>
#include<queue>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<algorithm>
#include<cmath>
#define rep(i,a,b) for(int i = a; i < b; i++)
#define _rep(i,a,b) for(int i = a; i <= b; i++)
using namespace std;
const int inf = 1e9 + 7;
int a[3000 + 7], dp[3000 + 7], n;
int main()
{
//    freopen("1.txt", "r", stdin);
    while(cin >> n && n){
        memset(dp, 0, sizeof(dp));//dp数组含义是以i为结束的最长上升子序列的最大值
        rep(i,0,n){
            cin >> a[i];dp[i] = a[i];
        }
        int ans = -inf;
        rep(i,0,n){
            rep(j, 0 ,i){
                if(a[i] > a[j]){
                    dp[i] = max(dp[i] , dp[j] + a[i]);//这里的最大值, 要么就是原来dp[j]的值加上a[i]
                                                      //要么就是dp[i]本身(dp[j]只有加上a[i]才能转移到dp[i])
                }
                    ans = max(ans, dp[i]);

            }
        }


//        rep(i,0,n) ans = max(ans, dp[i]); //其实这里没必要, dp[i]每次更新后都是最优
        printf("%d
", ans);
    }
}
原文地址:https://www.cnblogs.com/Jadon97/p/8359082.html