地址:http://acm.hdu.edu.cn/showproblem.php?pid=1087
题意:这个样例很误导人啊,这个题意呢,就是从起点跳到终点,保持递增跳而且得分最大。注意,起点和终点是不计分的;
解析:模板改一下就好了,之前求的是序列长度。这里求和,那么只要把dp初始化a[ ],依然还是探讨每个数选还是不选的问题。转移方程:
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; } }
原文:https://www.cnblogs.com/liyexin/p/12683114.html