HDU1087(最长上升子序列DP)

来源:互联网 发布:苹果录屏用什么软件 编辑:程序博客网 时间:2024/04/30 05:49

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1087


解题思路:

i < j 时 , dp[ i ] = max( dp[ j ] + a[ i ] , a[ i ] ) 。记录保存最大的dp[ i ]  值即可。dp[ i ] 代表从1到 i 的最大上升子序列的和,里层循环为dp[ i ]做更新,寻找1到 i 区间内的最大上升子序列和,从而使得其具有局部最优子结构。


完整代码:

#include <functional>#include <algorithm>#include <iostream>#include <fstream>#include <sstream>#include <iomanip>#include <numeric>#include <cstring>#include <climits>#include <cassert>#include <complex>#include <cstdio>#include <string>#include <vector>#include <bitset>#include <queue>#include <stack>#include <cmath>#include <ctime>#include <list>#include <set>#include <map>using namespace std;#pragma comment(linker, "/STACK:102400000,102400000")typedef long long LL;typedef double DB;typedef unsigned uint;typedef unsigned long long uLL;/** Constant List .. **/ //{const int MOD = int(1e9)+7;const int INF = 0x3f3f3f3f;const LL INFF = 0x3f3f3f3f3f3f3f3fLL;const DB EPS = 1e-9;const DB OO = 1e20;const DB PI = acos(-1.0); //M_PI;const int maxn = 10001;int a[maxn];int dp[maxn];int main(){    #ifdef DoubleQ    freopen("in.txt","r",stdin);    #endif    std::ios::sync_with_stdio(false);    std::cin.tie(0);    int n;    while(cin >> n)    {        if(n == 0)            break;        for(int i = 0 ; i < n ; i ++)            cin >> a[i];        int maxx = -INF;        for(int i = 0 ; i < n ; i ++)        {            dp[i] = a[i];            if(dp[i] > maxx)                maxx = dp[i];            for(int j = 0 ; j < i ; j ++)            {                if(a[i] > a[j] && dp[j] + a[i] > dp[i])                {                    dp[i] = dp[j] + a[i];                    if(dp[i] > maxx)                        maxx = dp[i];                }            }        }        cout << maxx << endl;    }}


0 0