思路和LIS差不多,dp[i]为i结尾最大值
#include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #include <algorithm> #include <stack> #include <queue> #include <cctype> #include <vector> #include <iterator> #include <set> #include <map> #include <sstream> using namespace std; #define mem(a,b) memset(a,b,sizeof(a)) #define pf printf #define sf scanf #define spf sprintf #define pb push_back #define debug printf("! ") #define MAXN 205 #define MAX(a,b) a>b?a:b #define blank pf(" ") #define LL long long #define ALL(x) x.begin(),x.end() #define INS(x) inserter(x,x.begin()) #define pqueue priority_queue #define INF 0x3f3f3f3f int n,m; int dp[1005],v[1005]; int main() { int i,j,k,a,b,kase=0; while(~sf("%d",&n) && n) { mem(dp,0); mem(v,0); int ans = 0; for(i=0;i<n;i++) { sf("%d",&v[i]); dp[i] = v[i]; ans = max(ans,dp[i]); } for(i=1;i<n;i++) { for(j=0;j<i;j++) { if(dp[i]>dp[j]) { dp[i] = max(dp[i],dp[j]+v[i]); ans = max(dp[i],ans); } } } pf("%d ",ans); } return 0; }