アドレス:http : //acm.hdu.edu.cn/showproblem.php?pid=1087
質問の意味:この例は非常に誤解を招くものです。この質問の意味は、最初から最後までジャンプし、ジャンプを増やし続け、最も多くスコアを付けることです。開始点と終了点はスコアリングされないことに注意してください。
分析:テンプレートを変更するだけで、シーケンスの長さが以前に求められていました。ここでまとめると、dpが[]で初期化されている限り、各数値が選択されているかどうかについて話し合います。伝達方程式:
if(a [i]> a [j]) dp [i] = max(dp [i]、dp [j] + a [i])
#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int maxn = 1e6 + 10 ; typedef long long ll; ll a [maxn]; ll dp [maxn]; int main() { ll n; while(cin >> n) { if(n == 0 ) break ; for(int i = 0 ; i <n; i ++ ) cin >>a [i]; for(int i = 0 ; i <n; i ++ ) dp [i] = a [i]; ll maxx = -1 ; ll sum = 0 ; for(int i = 1 ; i <n; i ++ ) { for(int j = 0 ; j <i; j ++ ) { if(a [i]> a [j]) { dp [i] = max(dp [ i]、dp [j] + a [i]); } } maxx = max(dp [i]、maxx); } cout << maxx << endl; } }