和求最长上升子序列的元素个数有点相似,状态转移方程为dp[i]=max(dp[j]+a[i],dp[i])其中a[j]<a[i], 注意要把所有元素都小于0的情况单独拿出来讨论
#include<iostream>#include<cstring>#include<algorithm>using namespace std;const int p=-0x3f3f3f3f;int main(){ int n; long long a[1000+1]; long long dp[1000+1]; int flag; while(cin>>n&&n!=0){ flag=0; memset(dp,p,sizeof(dp)); dp[0]=0; for(int i=1;i<=n;i++){ cin>>a[i]; if(a[i]>=0) flag=1; } for(int i=1;i<=n;i++){ for(int j=0;j<i;j++){ if(a[j]<a[i]) dp[i]=max(dp[j]+a[i],dp[i]);//因为j从0开始递增且dp[0]=0,就使得dp[i]刚开始就等于a[i] } } if(!flag){ sort(a,a+n+1); cout<<a[n-1]<<endl; continue; } sort(dp,dp+n+1); cout<<dp[n]<<endl; } return 0;}
新闻热点
疑难解答