D - Super Jumping! Jumping! Jumping! HDU - 1087 (基础DP)

题目大意: 给出一个序列,然后求这个序列的最大上升子序列的和。

题解:定义状态dp[i]表示前i个数的最大和,dp[i]的最小值应该是arr[i]了,因为i前边可能有负数,对于负数,虽然可以构成上升子序列,但是没有必要选。

code:

#include<bits/stdc++.h>
using namespace std;
const long long  INF=1e18+7;
const int N=1e3+7;
long long  arr[N];
long long dp[N];
int main(){
    int n;
    while(cin>>n,n){ 
        for(int i=1;i<=n;i++){
            cin>>arr[i];
            dp[i]=arr[i];
        } 
        long long  ans=arr[1];
        for(int i=1;i<=n;i++){
            for(int j=1;j<i;j++){
                if(arr[i]>arr[j]){
                    dp[i]=max(dp[i],dp[j]+arr[i]);
                }
            }
            ans=max(ans,dp[i]);
        }
        cout<<ans<<endl;
    }
    return 0;
} 

猜你喜欢

转载自www.cnblogs.com/Accepting/p/12960270.html