题目:
代码如下:
#include<bits/stdc++.h>
using namespace std;
long long a[1005],dp[1005];
int main()
{
long long n,ans = -1;
cin >> n;
for(int i = 0;i < n;i++) cin >> a[i];
for(int i = 0;i < n;i++){
dp[i] = a[i];
for(int j = 0;j < i;j++){
if(a[j] < a[i] && dp[j] + a[i] > dp[i]) dp[i] = dp[j] + a[i];
}
ans = max(ans,dp[i]);
}
cout << ans << endl;
return 0;
}
这道题是求上升序列最大和,dp[i]代表前i关最大难度和,每次求dp[i]的值,首先肯定把自己本身那关的难度累加进去,所以一开始dp[i] = a[i],然后再想办法从最前面的关卡一直尝试往这一关转移,如果前i关中的第j关难度小于这一关也就是a[j] < a[i],并且走过前j关的难度加上这一关的难度还大于走过前i关的难度那就更新,也就是dp[i] = dp[j] + a[i]。每次挑出最大值输出就是上升序列的最大和。