vjudge今晚不知道怎么了,抽风了一段时间,于是我接着复习去了,结果又不想复习再一连就连上来了,算了刷刷水题,涨涨自信吧。
记忆化搜索dp,思路不说了,注意一下longlong不要溢出就可以。
题目链接:https://vjudge.net/problem/HDU-1087
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 1005;
int n;
int G[maxn];
long long dp[maxn];
long long dfs (int pos) {
if (pos == n) return dp[pos] = G[pos];
if (dp[pos]) return dp[pos];
long long ans = G[pos];
for (int i = 1 ; i <= n-pos ; i++)
if(G[pos] < G[pos+i]) ans = max(ans , dfs(pos+i)+G[pos]);
return dp[pos] = ans;
}
int main () {
while (scanf("%d" , &n) != EOF && n) {
long long ans = 0;
memset(dp,0,sizeof(dp));
memset(G, 0,sizeof(G));
for (int i = 1 ; i <= n ; i++)
scanf("%d" , &G[i]);
for(int i = 1 ; i <= n ; i++)
ans = max(ans , dfs(i));
printf("%d\n" , ans);
}
}